home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / nifp / nifp.c next >
C/C++ Source or Header  |  1993-07-08  |  101KB  |  4,576 lines

  1. /*
  2.  *    NIFTYログ専用簡単ページャ V3.71
  3.  *
  4.  *
  5.  *    BORLAND TURBO C V2.0で作成しました。
  6.  *
  7.  *    著作権はやなさん(NIFTY-Serve:GHC00073)が所有しています。
  8.  *
  9.  *    98用コンパイル方法
  10.  *         make -f nifpmake.98
  11.  *    FM用コンパイル方法
  12.  *         make -f nifpmake.fm
  13.  *    AT用コンパイル方法
  14.  *         make -f nifpmake.at
  15.  *
  16.  * ソースファイル構成は,
  17.  *        nifp.c nifplog.c nifpsub.c nifptool.c nifp.h
  18.  *  タブ数は4カラムとなっています。
  19.  *  TURBO Cでリンクする時には,引き数にワイルドカードが使えるようにライブラリを編集して
  20.  *  ください。
  21.  */
  22. /*
  23.  *     このモジュールは,NIFPのメイン部です。主にタイトル一覧表示と内容表示を処理します。
  24.  *     このモジュールは,マシン依存していません。
  25.  */
  26.  
  27. #include "nifp.h"
  28.  
  29. char *cfgversion = "1.40";
  30. PCELL far *p_top=(PCELL far *)0;    /* タイトルテーブル先頭ポインタ */
  31. PCELL far *p_head=(PCELL far *)0;    /* タイトルテーブル処理中先頭ポインタ */
  32. PCELL far *p_tail=(PCELL far *)0;    /* タイトルテーブル最終ポインタ */
  33. char filename[129],gfilename[13];    /* 処理中ログファイル名 */
  34. long saveatime=0;
  35. int fupmode = 0;
  36. union REGS regs;                    /* DOS用レジスタ群 */
  37. struct SREGS sregs;                    /* DOS用セグメントレジスタ群 */
  38. char far *buf1[MAXLINE];            /* 内容表示用行バッファポインタ */
  39. char fbuf1[MAXLINE];                /* 内容表示用行フラグ */
  40. char far *file[FMAXFILE];            /* 複数ファイル用テーブル */
  41. FILE *fd;                            /* 処理中ログファイルFD */
  42. long p,p_linecount=0,savep,sentakuno=0,sakujyono=0,tagno=0;
  43. char nmode,savecon,nifmode,savenmode,bunmode=0,foutmode=0;
  44. char tagmode=0;
  45. char titlemode=0;
  46. char datfile[129] = "\\NIFP.DAT";
  47. char far *datf[MAXDATF];            /* 未読記憶ファイル用ファイル名+既読数テーブル */
  48. long midokuno=0;
  49. int savepno;
  50. int cfno,fno,maxfno;
  51. int line = 0,saveline;
  52. int typespeed = 20;
  53. int startmode = 0;
  54. int waittimes = 3;
  55. int titlecount = 20;
  56. int vrammode = 0;
  57. int fsortmode = 0;
  58. int fsort2mode = 0;
  59. int autodisptime = 5;
  60. int autodisptime2 = 5;
  61. char autodispsw = 0;
  62. char pagemode = 0;
  63. char sepamode = 0;
  64. char editer[41] = "VZ";
  65. char kiridir[51] = "";
  66. char hatudir[51] = "";
  67. char titledir[51] = "";
  68. char printprg[41] = "PRINT";
  69. char messtring[2][4][21];
  70. char bakdir[51] = "";
  71. char far *logdir[LOGDIRMAX];
  72. char cmdtbl[15][41];
  73. char treechar[12] = "+- +- |  +-";
  74. char touttop[129] = "";
  75. char prtsepa[129] = "^J";
  76. char kiridashitop[3][257];
  77. char hatutop[2][4][257];
  78. char hatuend[2][4][257];
  79. char keytbl[256] = {  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* 00 */
  80.                       0x08,0x09,0x00,0x00,0x00,0x0d,0x00,0x00,
  81.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* 10 */
  82.                       0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,
  83.                       0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* 20 */
  84.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  85.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* 30 */
  86.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  87.                       0x00,0x00,0x00,0x00,0xca,0xc1,0x00,0x00,    /* 40 */
  88.                       0x84,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,
  89.                       0xc7,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,    /* 50 */
  90.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  91.                       0x00,0x00,0x00,0x00,0xca,0xc1,0x00,0x00,    /* 60 */
  92.                       0x84,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,
  93.                       0xc7,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,    /* 70 */
  94.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  95.                       0x00,0x81,0x82,0x83,0x84,0x85,0x86,0x87,    /* 80 */
  96.                       0x88,0x89,0x8a,0xc2,0x84,0xc6,0xc7,0xc1,
  97.                       0x90,0x91,0x92,0x93,0x90,0x91,0x82,0x84,    /* 90 */
  98.                       0x87,0x86,0x0d,0x1b,0xa2,0x00,0xa3,0x1b,
  99.                       0xaa,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,    /* A0 */
  100.                       0xa8,0xa9,0xaa,0x00,0x00,0x00,0x00,0x00,
  101.                       0x82,0x83,0xa2,0xa3,0x90,0x91,0x83,0x84,    /* B0 */
  102.                       0x87,0x86,0x00,0x00,0xa2,0x00,0xa3,0x00,
  103.                       0x00,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,    /* C0 */
  104.                       0xc8,0xc9,0xca,0x00,0x00,0x00,0x00,0x00,
  105.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* D0 */
  106.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  107.                       0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    /* E0 */
  108.                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  109.                       0x00,0x00,0x00,0x00,0x00,0xf5,0xf6,0xf7,    /* F0 */
  110.                       0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0x00 };
  111. char irotbl[IROMAX] = {    15,13,14,12,5,13,7,15,5,13,2,10,7,12,
  112.                         15,12,10,12,12,12,1,9,2,10,3,11,39,47,
  113.                         6,14,1,5,15,13,15,7,6,4,2 };
  114. int endmode = 1;
  115. int tabno = 8;
  116. int topendmode = 0;
  117. int yesnomode = 1;
  118. int sakujyomode = 0;
  119. int editmode = 0;
  120. int nextmode = 0;
  121. int tabcrmode = 1;
  122. int jikokumode = 2;
  123. int cutmode = 0;
  124. int returnmode = 0;
  125. int keyshiftmode = 0;
  126. int midokumode = 0;
  127. int passmode = 0;
  128. int timechkmode = 1;
  129. PCELL far *rsv_p = (PCELL far *)0;
  130. char savsafix[4]="SAV";
  131. char nifsafix[4]="NIF";
  132. char ESCin[10]="";
  133. char ESCout[10]="";
  134. char far *cutstrtbl[MAXCUTNO];    /* カット文字列登録テーブル */
  135. char far *msgstrtbl[MAXMSGNO];    /* フォーラム3回メッセージ文字列登録テーブル */
  136. int emsno = 0;
  137. int ems_count = 0;
  138. int ems_lno = -1;
  139. int ems_handle = 0;
  140. long ems_seg = 0;
  141. PCELL far *p_freetop = (PCELL far *)0;
  142. PCELL3 far *p_tbltop = (PCELL3 far *)0;
  143.  
  144. int savekeymode;
  145. int keta=1,gyo=1,tmode=0;
  146. long vramoffset;
  147. int kensakukensu=0;
  148. PCELL far *ttop;
  149. PCELL far *ttail;
  150. PCELL far *ggtop;
  151. PCELL far *ggtail;
  152. PCELL far *gpo;
  153. char nifid[9];
  154. char kensakumoji[39]="";
  155. char *space="                                                                                ";
  156. char *toperror="先頭です";
  157. char *enderror="最終です";
  158. char *cancelerror="取り消しができません";
  159. char *tagseterror="タグ設定ができません";
  160. char *tagnoterror="タグが見つかりません";
  161. char *filenoterror="ファイルがありません";
  162. char *keyerror="無効なキー入力です";
  163. char *bunnasierror="内容がありません";
  164. char *notcomenterror="ここではコメント機能は無効です";
  165. char *notiderror="IDがないので無効です";
  166. char *etckeymsg="何かキーを押してください";
  167. char *filenoerror="指定ファイルがありません。";
  168. char *srcmsg="只今、検索中です。しばらくお待ちください。";
  169. char *memgeterror="メモリ獲得に失敗";
  170.  
  171. static int sethatu();    /* 発言ヘッダフッタ出力 */
  172.  
  173. void xhpread(int count)
  174. {
  175.     if(count <= p) return;
  176.     if(count == MAXPOINT) hpread(count,1);
  177.     else                  hpread(count-p,0);
  178.     ttail = p_tail;
  179. }
  180.  
  181. static void buffreesub(int k) /* 内容表示バッファ返却(1行) */
  182. {
  183.     farfree(buf1[k]);
  184.     buf1[k] = 0;
  185. }
  186.  
  187. static void bunbuffree(void)    /* 内容表示バッファ返却 */
  188. {
  189.     int k;
  190.  
  191.     for(k=0;buf1[k] && k < MAXLINE;k++)
  192.         buffreesub(k);
  193. }
  194.  
  195. static int fputsub(char *buf,FILE *fd1,char *fname)    /* ファイル出力サブルーチン */
  196. {
  197.     char errbuf[81];
  198.  
  199.     if(fputs(buf,fd1) == EOF) {
  200.         sprintf(errbuf,"%sファイルの書き出し失敗",fname);
  201.         errdisp2(errbuf);
  202.         fclose(fd1);
  203.         return(-1);
  204.     }
  205.     return(0);
  206. }
  207.  
  208. extern int defline;
  209. static void chgline(PCELL far *tcu)    /* 行数切り換え */
  210. {
  211.     xhpread(tcu->count+line);
  212.     if(line != defline) chglowline();
  213.     else                 chghighline();
  214.     line = getline();
  215.     csloff();
  216. }
  217.  
  218. static int check_fup(void)
  219. {
  220.     char a[81];
  221.     struct stat sbuf;
  222.  
  223.     if(startmode == 8) return(0);
  224.     if(stat(filename,&sbuf)) {
  225.         sprintf(a,"%sファイルが削除されたので,終了します",gfilename);
  226.         errdisp2(a);
  227.         return(-2);
  228.     }
  229.     if(sbuf.st_atime != saveatime) {
  230.         sprintf(a,"%sファイルが変更されたので,読み直します",gfilename);
  231.         errdisp2(a);
  232.         return(-1);
  233.     }
  234.     return(0);
  235. }
  236.  
  237. static void systemcall(char *sys,char *buf)    /* DOSコマンド呼び出し */
  238. {
  239.     int c;
  240.     char c_dir[256];
  241.  
  242.     c = getdisk();
  243.     getcwd(c_dir,255);
  244.     allclr();
  245.     restorecon(0);
  246.     setline(saveline);
  247.     cslon();
  248.     if(strlen(buf)) printf(buf);
  249.     system(sys);
  250.     ems_lno = -1;
  251.     allclr();
  252.     setdisk(c);
  253.     chdir(c_dir);
  254.     setcon(0);
  255.     setline(line);
  256. }
  257.  
  258. static int oscall(void)    /* DOS呼び出し */
  259. {
  260.     systemcall("","\nexitで元に戻ります。\n");
  261.     return(check_fup());
  262. }
  263.  
  264. static char printonoff=0;
  265. static void prt_sub0(char *template,char *fname) /* 印刷用ファイル名作成&フラグON */
  266. {
  267.     char *tmp;
  268.  
  269.     tmp = getenv("TMP");
  270.     if(tmp) {
  271.         strcpy(template,tmp);
  272.         if(template[strlen(template)-1] != '\\')
  273.             strcat(template,"\\");
  274.     }
  275.     else strcpy(template,"\\");
  276.     strcat(template,"$PRXXXXXX");
  277.     strcpy(&fname[2],mktemp(template));
  278.     printonoff = 1;
  279. }
  280.  
  281. static void prt_sub(char *fname)    /* 印刷サブルーチン */
  282. {
  283.     char sys[256];
  284.  
  285.     xlocate();
  286. /*    kprintf("印刷中です。"); */
  287.     sprintf(sys,"%s %s",printprg,fname);
  288.     systemcall(sys,"\n印刷中です。\n");
  289. }
  290.  
  291. static char linework[6] = "";
  292. FILE *fopen_sub(char *fname,int mode)        /* 追加ファイルオープン */
  293. {
  294.     FILE *fd1;
  295.     int f,i=0,l=1;
  296.     char a[300];
  297.  
  298.     strcpy(linework,"1");
  299.     if(fd1 = fopen(fname,"rt")) {
  300.         if(mode) {
  301.             while(fgets(a,300,fd1))
  302.                 l++;
  303.             sprintf(linework,"%ld",l);
  304.         }
  305.         if(!fseek(fd1,-1,SEEK_END))
  306.             if(fgetc(fd1) == EOF) i = -1;
  307.         fclose(fd1);
  308.         if((f = open(fname,O_WRONLY|O_TEXT)) == -1) {
  309.             sprintf(a,"%sファイルのオープンに失敗",fname);
  310.             errdisp2(a);
  311.             return(0);
  312.         }
  313.         fd1 = fdopen(f,"at");
  314.         fseek(fd1,i,SEEK_END);
  315.         return(fd1);
  316.     }
  317.     return(xxfopen(fname, "at"));
  318. }
  319.  
  320. static void grh_dispx(char *buf,int mode)
  321. {
  322.     char b[81];
  323.  
  324.     grh_disp(buf,mode);
  325.     sprintf(b,"只今、%sです。",buf);
  326.     xlocate();
  327.     kprintf(b);
  328. }
  329.  
  330. static int titleout(void)    /* タイトル一覧ファイル出力 */
  331. {
  332.     FILE *fd1;
  333.     PCELL far *pt;
  334.     char fname[53],buf[81],template[53];
  335.     int j;
  336.  
  337.     template[0] = 0;
  338.     xhpread(MAXPOINT);
  339.     sprintf(buf,"タイトル出力先ファイル名 = ");
  340.     fname[0] = 50;
  341.     strcpy(&fname[2],titledir);
  342.     cgetfsx(buf, fname);
  343.     if(!fname[2])
  344.         return(0);
  345.     if(!strcmp(&fname[2],"PRT")) {
  346.         prt_sub0(template,fname);
  347.     }
  348.     if(!(fd1 = fopen_sub(&fname[2],0)))
  349.         return(0);
  350.     if(strlen(touttop)) {
  351.         if(!sethatu(touttop,fd1,&fname[2],1))    /* ヘッダ出力 */
  352.             return(0);
  353.     }
  354.     grh_dispx("タイトル出力処理中",1);
  355.     for(pt = p_head,j=1;pt->mode != NEND;pt = pt->next) {
  356.         if(!pt->count) continue;
  357. /*        xlocate();
  358.         sprintf(buf,"只今、%d/%dタイトル目を出力中です。",j,p_tail->count-1);
  359.         kprintf(buf); */
  360.         tbl_set(pt);
  361.         _fstrcpy((char far *)buf,pt->p->title);
  362.         strcat(buf,"\n");
  363.         if(fputsub(buf,fd1,&fname[2])) {
  364.             return(1);
  365.         }
  366.         if(keycheck() && getch() == 0x1b) break;
  367.         if(!(j % 10)) grh_sub(j++,p_tail->count-1);
  368.     }
  369.     grh_sub(1,1);
  370.     fclose(fd1);
  371.     if(strlen(template))
  372.         prt_sub(&fname[2]);
  373.     else
  374.         xxstrncpy50(titledir,&fname[2]);
  375.     return(1);
  376. }
  377.  
  378. static char kirititle[81];
  379. static int sethatusub(char *a,char *b)    /* 引用格納サブルーチン */
  380. {
  381.     int i,j;
  382.  
  383.     if(!strlen(b)) return(0);
  384.     for(i=j=0;b[i];i++)
  385.         a[j++] = b[i];
  386.     a[j] = 0;
  387.     return(j);
  388. }
  389.  
  390. static int fukusyasub(PCELL far *tcu,int mode)    /* 切り出し・コピー・印刷サブルーチン */
  391. {
  392.     FILE *fd1;
  393.     PCELL far *pt;
  394.     char fname[53],buf[81],sys[101],*usercmd,template[53];
  395.     int i,j,k,m,x=0;
  396.  
  397.     template[0] = 0;
  398.     if(!sentakuno) {
  399.         tbl_set(tcu);
  400. /*        if(tcu->mode == NEND || tcu->mode == NSEPA) */
  401.         if(tcu->mode == NEND || tcu->p->top == tcu->p->tail)
  402.             return(0);
  403.         tcu->flag |= FSENTAKU;
  404.         sentakuno++;
  405.         x = 1;
  406.     }
  407.     if(mode == 2) {
  408.         sprintf(buf,"%d件の内容を印刷しますか",sentakuno);
  409.         if(!yesnocheck(buf)) {
  410. copy_err:
  411.             if(x) {
  412.                 tcu->flag &= ~FSENTAKU;
  413.                 sentakuno--;
  414.             }
  415.             return(0);
  416.         }
  417.     }
  418.     else {
  419.         sprintf(buf,"%d件の",sentakuno);
  420.         if(!mode) strcat(buf,"コピー先ファイル名 = ");
  421.         else      strcat(buf,"切り出し先ファイル名 = ");
  422.         fname[0] = 50;
  423.         strcpy(&fname[2],kiridir);
  424.         cgetfsx(buf, fname);
  425.         if(!fname[2]) {
  426.             goto copy_err;
  427.         }
  428.     }
  429.     if(mode == 2 || !(strcmp(&fname[2],"PRT"))) {
  430.         prt_sub0(template,fname);
  431.     }
  432.     if(!(fd1 = fopen_sub(&fname[2],1)))
  433.         goto copy_err;
  434.     bunbuffree();
  435.     for(pt=p_head;sentakuno && pt->mode != NEND;pt=pt->next)
  436.         if((pt->flag & FSENTAKU)) break;
  437.     pt = pt->grp;
  438.     tbl_set(pt);
  439.     _fstrcpy((char far *)kirititle,pt->p->title);
  440.     if(mode != 2 && strlen(kiridashitop[1])) {
  441.         if(!sethatu(kiridashitop[1],fd1,fname,1))     /* ヘッダ出力 */
  442.             goto copy_err;
  443.     }
  444.     if(!mode) {
  445.         grh_dispx("コピー処理中",1);
  446.     }
  447.     else {
  448.         grh_dispx("切り出し処理中",1);
  449.     }
  450.     for(pt=p_top,j=1,x=sentakuno;sentakuno && pt->mode != NEND;pt=pt->next) {
  451.         if(!(pt->flag & FSENTAKU)) continue;
  452. /*        xlocate();
  453.         sprintf(buf,"只今、%d/%dタイトル目を出力中です。",j,x);
  454.         kprintf(buf); */
  455.         tbl_set(pt);
  456.         if(pt->p->top == pt->p->tail) {
  457.             _fstrcpy((char far *)buf,pt->p->title);
  458.             strcat(buf,"\n");
  459.             if(fputsub(buf,fd1,&fname[2])) {
  460.                 return(1);
  461.             }
  462.         }
  463.         else {
  464.             if(m = bunget(pt,0)) {
  465.                 for(k=0;k < m-1;k++) {
  466.                     _fstrcpy((char far *)buf,buf1[k]);
  467.                     buffreesub(k);
  468.                     if(fputsub(buf,fd1,&fname[2])) {
  469.                         for(;buf1[k] && k < MAXLINE;k++) {
  470.                             buffreesub(k);
  471.                         }
  472.                         return(1);
  473.                     }
  474.                 }
  475.             }
  476.         }
  477.         if(mode == 2) {
  478.             if(!sethatu(prtsepa,fd1,&fname[2])) {
  479.                 return(1);
  480.             }
  481.         }
  482.         if(keycheck() && getch() == 0x1b) break;
  483.         grh_sub(j++,x);
  484.         pt->flag &= ~FSENTAKU;
  485.         sentakuno--;
  486.         if(mode == 1) {
  487.             if(!(pt->flag & FSAKUJYO)) {
  488.                 pt->flag |= FSAKUJYO;
  489.                 sakujyono++;
  490.             }
  491.         }
  492.     }
  493.     if(mode != 2 && strlen(kiridashitop[2])) {
  494.         if(!sethatu(kiridashitop[2],fd1,fname,1))     /* フッタ出力 */
  495.             goto copy_err;
  496.     }
  497.     fclose(fd1);
  498.     if(strlen(template)) {
  499.         prt_sub(&fname[2]);
  500.         return(1);
  501.     }
  502.     xxstrncpy50(kiridir,&fname[2]);
  503.     usercmd = kiridashitop[0];
  504.     if(strlen(usercmd)) {
  505.         for(i=j=0;usercmd[i];i++) {
  506.             if(iskanji(usercmd[i]) && iskanji2(usercmd[i+1])) {
  507.                 sys[j++] = usercmd[i++];
  508.                 sys[j++] = usercmd[i];
  509.                 continue;
  510.             }
  511. /*            if(usercmd[i] == '$' && usercmd[i+1] == 'f') {
  512.                 k = sethatusub(&sys[j],&fname[2]);
  513.                 i++;
  514.                 j += k;
  515.                 continue;
  516.             } */
  517.             if(usercmd[i] == '$') {
  518.                 switch(usercmd[++i]) {
  519.                 case 'f':    k = sethatusub(&sys[j],&fname[2]);
  520.                             break;
  521.                 case 'l':    k = sethatusub(&sys[j],linework);
  522.                             break;
  523.                 default:    sys[j] = usercmd[i]; k = 1; break;
  524.                 }
  525.                 j += k;
  526.                 continue;
  527.             }
  528.             sys[j++] = usercmd[i];
  529.         }
  530.         sys[j] = 0;
  531.         systemcall(sys,"");
  532.     }
  533.     return(1);
  534. }
  535.  
  536. static int fukusya(PCELL far *tcu)    /* コピー */
  537. {
  538.     return(fukusyasub(tcu,0));
  539. }
  540.  
  541. static int kiridasi(PCELL far *tcu)    /* 切り出し */
  542. {
  543.     return(fukusyasub(tcu,1));
  544. }
  545.  
  546. static int printsub(PCELL far *tcu)    /* 印刷サブルーチン */
  547. {
  548.     return(fukusyasub(tcu,2));
  549. }
  550.  
  551. static int sakujyo(PCELL far *tcu)    /* 削除 */
  552. {
  553.     PCELL far *pt;
  554.     char buf[81];
  555.  
  556.     if(!sentakuno) {
  557.         if(tcu->flag & FSAKUJYO) {
  558.             tcu->flag &= ~FSAKUJYO;
  559.             sakujyono--;
  560.             return(2);
  561.         }
  562.         if(tcu->mode == NEND)
  563.             return(0);
  564. /*        if(tcu->mode == NSEPA) */
  565.         tbl_set(tcu);
  566.         if(tcu->p->top == tcu->p->tail)
  567.             return(2);
  568.         tcu->flag |= FSAKUJYO;
  569.         sakujyono++;
  570.         return(2);
  571.     }
  572.     sprintf(buf,"%d件を削除指定しますか",sentakuno);
  573.     if(!yesnocheck(buf)) return(0);
  574.     for(pt=p_top;sentakuno && pt->mode != NEND;pt=pt->next) {
  575.         if(!(pt->flag & FSENTAKU)) continue;
  576.         pt->flag &= ~FSENTAKU;
  577.         sentakuno--;
  578.         if(pt->flag & FSAKUJYO) continue;
  579.         pt->flag |= FSAKUJYO;
  580.         sakujyono++;
  581.     }
  582.     return(1);
  583. }
  584.  
  585. static int
  586. cmdfilesub(PCELL far *tcu,char *fname,int mode)    /* コマンド用ファイル出力 */
  587. {
  588.     FILE *fd1;
  589.     PCELL far *pt;
  590.     PCELL far *w;
  591.     char a,buf[81],template[53],work[9];
  592.     int i,j,k,m,x=0;
  593.     char *tmp;
  594.  
  595.     template[0] = 0;
  596.     if(!sentakuno) {
  597.         tbl_set(tcu);
  598. /*        if(tcu->mode == NEND || tcu->mode == NSEPA) */
  599.         if(tcu->mode == NEND || tcu->p->top == tcu->p->tail)
  600.             return(0);
  601.         tcu->flag |= FSENTAKU;
  602.         sentakuno++;
  603.         x = 1;
  604.     }
  605.     tmp = getenv("TMP");
  606.     if(tmp) {
  607.         strcpy(template,tmp);
  608.         if(template[strlen(template)-1] != '\\')
  609.             strcat(template,"\\");
  610.     }
  611.     else strcpy(template,"\\");
  612.     strcpy(&fname[2],template);
  613.     if(!mode) {
  614.         memset(work,0,9);
  615.         w = tcu->grp;
  616.         tbl_set(w);
  617.         _fmemcpy((char far *)work,w->p->nifid,8);
  618.     }
  619.     else {
  620.         for(i=j=0;(j < 8) && (a=gfilename[i++]) && (a != '.');) {
  621.             work[j++] = a;
  622.         }
  623.         work[j] = 0;
  624.     }
  625.     if(strlen(work)) strcat(&fname[2],work);
  626.     else             strcat(&fname[2],"NIFP");
  627.     strcat(&fname[2],".@_@");
  628.     if(!(fd1 = fopen_sub(&fname[2],0))) {
  629. copy_err:
  630.         if(x) {
  631.             tcu->flag &= ~FSENTAKU;
  632.             sentakuno--;
  633.         }
  634.         return(0);
  635.     }
  636.     bunbuffree();
  637.     grh_dispx("テンポラリーファイル出力処理中",0);
  638.     for(pt=p_top,j=1,x=sentakuno;sentakuno && pt->mode != NEND;pt=pt->next) {
  639.         if(!(pt->flag & FSENTAKU)) continue;
  640. /*        xlocate();
  641.         sprintf(buf,"只今、%d/%dタイトル目を出力中です。",j,x);
  642.         kprintf(buf); */
  643.         tbl_set(pt);
  644.         if(pt->p->top == pt->p->tail) {
  645.             _fstrcpy((char far *)buf,pt->p->title);
  646.             strcat(buf,"\n");
  647.             if(fputsub(buf,fd1,&fname[2])) {
  648.                 return(0);
  649.             }
  650.         }
  651.         else {
  652.             if(m = bunget(pt,0)) {
  653.                 for(k=0;k < m-1;k++) {
  654.                     _fstrcpy((char far *)buf,buf1[k]);
  655.                     buffreesub(k);
  656.                     if(fputsub(buf,fd1,&fname[2])) {
  657.                         for(;buf1[k] && k < MAXLINE;k++) {
  658.                             buffreesub(k);
  659.                         }
  660.                         return(0);
  661.                     }
  662.                 }
  663.             }
  664.         }
  665.         grh_sub(j++,x);
  666.         pt->flag &= ~FSENTAKU;
  667.         sentakuno--;
  668.     }
  669.     grh_sub(1,1);
  670.     fclose(fd1);
  671.     return(1);
  672. }
  673.  
  674. static int usertouroku(PCELL far *tcu,int lno)    /* 利用者コマンド処理 */
  675. {
  676.     int  i,c;
  677.     char buf[256],c_dir[256],c_file[256];
  678.  
  679.     if((i = comand_disp(tcu,lno)) == -1) return(0);
  680.     if(strstr(cmdtbl[i],"$p")) {
  681.         if(!cmdfilesub(tcu,c_file,0)) return(0);
  682.     }
  683.     else if(strstr(cmdtbl[i],"$P")) {
  684.         if(!cmdfilesub(tcu,c_file,1)) return(0);
  685.     }
  686.     else c_file[2] = 0;
  687.     set_cmdcopy(buf,i,tcu,&c_file[2],lno);
  688.     c = getdisk();
  689.     getcwd(c_dir,255);
  690.     allclr();
  691.     restorecon(0);
  692.     setline(saveline);
  693.     cslon();
  694.     system(buf);
  695.     allclr();
  696.     ems_lno = -1;
  697.     if(!strstr(cmdtbl[i],"$K")) {
  698.         locate(1,line-1);clr();
  699.         kprintf(etckeymsg);
  700.         keyget();
  701.     }
  702.     setdisk(c);
  703.     chdir(c_dir);
  704.     setcon(0);
  705.     setline(line);
  706.     if(c_file[2] != 0) {
  707.         remove(&c_file[2]);
  708.         if(i=check_fup()) return(i);
  709.         return(1);
  710.     }
  711.     return(check_fup());
  712. }
  713.  
  714. static int torikesi(void)    /* 選択取消 */
  715. {
  716.     PCELL far *pt;
  717.     char b[39];
  718.  
  719.     if(sentakuno) {
  720.         sprintf(b,"%d件の選択を取り消しますか",sentakuno);
  721.         if(!yesnocheck(b)) return(1);
  722.     }
  723.     else {
  724.         errdisp1(cancelerror);
  725.         return(0);
  726.     }
  727.     for(pt=p_top;sentakuno && pt->mode != NEND;pt=pt->next) {
  728.         if(!(pt->flag & FSENTAKU)) continue;
  729.         pt->flag &= ~FSENTAKU;
  730.         sentakuno--;
  731.     }
  732.     return(1);
  733. }
  734.  
  735. static int sakutorikesi(void)        /* 削除取消 */
  736. {
  737.     PCELL far *pt;
  738.     char b[39];
  739.     int i,mode=0;
  740.  
  741.     if(sakujyono) {
  742.         for(i=0,pt=p_top;pt && pt->mode != NEND;pt=pt->next) {
  743.             if((pt->flag & FSAKUJYO) && (pt->flag & FSENTAKU)) i++;
  744.         }
  745.         if(i) mode = 1;
  746.         else  i = sakujyono;
  747.         sprintf(b,"%d件の削除指定を取り消しますか",i);
  748.         if(!yesnocheck(b)) return(1);
  749.     }
  750.     else {
  751.         errdisp1(cancelerror);
  752.         return(0);
  753.     }
  754.     for(pt=p_top;i && pt->mode != NEND;pt=pt->next) {
  755.         if(!(pt->flag & FSAKUJYO)) continue;
  756.         if(mode) {
  757.             if(pt->flag & FSENTAKU) {
  758.                 pt->flag &= ~FSENTAKU;
  759.                 sentakuno--;
  760.             }
  761.             else continue;
  762.         }
  763.         pt->flag &= ~FSAKUJYO;
  764.         sakujyono--;
  765.         i--;
  766.     }
  767.     return(1);
  768. }
  769.  
  770. char YEAR[5],year[3],mon[3],mon2[2],mday[3],hour1[3],hour2[3],min[3],sec[3],ampm[3];
  771. void dateget(void) {    /* 現在時刻読み込み */
  772.     struct tm *jtime;
  773.     time_t ltime[1];
  774.     int w;
  775.  
  776.     time(ltime);
  777.     jtime = localtime(ltime);
  778.     if(jtime->tm_year > 70) sprintf(YEAR,"19%02d",jtime->tm_year);
  779.     else                 sprintf(YEAR,"20%02d",jtime->tm_year);
  780.     sprintf(year,"%02d",jtime->tm_year);
  781.     w = jtime->tm_mon+1;
  782.     sprintf(mon,"%02d",w);
  783.     if(w < 10) sprintf(mon2,"%d",w);
  784.     else       sprintf(mon2,"%c",w+'A'-10);
  785.     sprintf(mday,"%02d",jtime->tm_mday);
  786.     sprintf(hour1,"%02d",jtime->tm_hour);
  787.     if(jtime->tm_hour < 12) {
  788.         sprintf(hour2,"%02d",jtime->tm_hour);
  789.         strcpy(ampm,"AM");
  790.     }
  791.     else {
  792.         sprintf(hour2,"%02d",jtime->tm_hour-12);
  793.         strcpy(ampm,"PM");
  794.     }
  795.     sprintf(min,"%02d",jtime->tm_min);
  796.     sprintf(sec,"%02d",jtime->tm_sec);
  797. }
  798.  
  799. static char hatutitle[81];
  800. static char hatunifid[9];
  801. static char hatuhpid[9];
  802. static char hatuheyano[3];
  803. static char hatucmtno[6];
  804. static char hatucmtno2[6];
  805. static char hatuforum[9];
  806. static char hatuhandle[19];
  807. static int
  808. sethatu(char *s,FILE *fd1,char *fname,int mode)    /* 発言ヘッダフッタ出力 */
  809. {
  810.     char c,buf[513],w[9];
  811.     int i,j,k;
  812.  
  813.     dateget();
  814.     for(i=j=0;(c=gfilename[i++]) && (c != '.');) {
  815.         w[j++] = c;
  816.     }
  817.     w[j] = 0;
  818.     for(i=j=0;s[i] && j < 512;i++) {
  819.         if(iskanji(s[i]) && iskanji2(s[i+1])) {
  820.             buf[j++] = s[i++];
  821.             buf[j++] = s[i];
  822.             continue;
  823.         }
  824.         if(s[i] == '$') {
  825.             switch(s[++i]) {
  826.             case 's':    rtncut(hatutitle);
  827.                         k = sethatusub(&buf[j],hatutitle);
  828.                         break;
  829.             case 'i':    k = sethatusub(&buf[j],hatunifid);
  830.                         break;
  831.             case 'I':    k = sethatusub(&buf[j],hatuhpid);
  832.                         break;
  833.             case 'n':    k = sethatusub(&buf[j],hatuheyano);
  834.                         break;
  835.             case 'c':    k = sethatusub(&buf[j],hatucmtno);
  836.                         break;
  837.             case 'C':    k = sethatusub(&buf[j],hatucmtno2);
  838.                         break;
  839.             case 'f':    k = sethatusub(&buf[j],gfilename);
  840.                         break;
  841.             case 'x':    k = sethatusub(&buf[j],w);
  842.                         break;
  843.             case 'h':    k = sethatusub(&buf[j],hatuhandle);
  844.                         break;
  845.             case 'F':    k = sethatusub(&buf[j],hatuforum);
  846.                         break;
  847.             case 't':    k = sethatusub(&buf[j],kirititle);
  848.                         break;
  849.             case 'y':    k = sethatusub(&buf[j],YEAR);
  850.                         break;
  851.             case 'Y':    k = sethatusub(&buf[j],year);
  852.                         break;
  853.             case 'T':    k = sethatusub(&buf[j],mon);
  854.                         break;
  855.             case 'D':    k = sethatusub(&buf[j],mday);
  856.                         break;
  857.             case 'H':    k = sethatusub(&buf[j],hour1);
  858.                         break;
  859.             case 'J':    k = sethatusub(&buf[j],hour2);
  860.                         break;
  861.             case 'M':    k = sethatusub(&buf[j],min);
  862.                         break;
  863.             case 'S':    k = sethatusub(&buf[j],sec);
  864.                         break;
  865.             case 'P':    k = sethatusub(&buf[j],ampm);
  866.                         break;
  867.             case 'a':    k = sethatusub(&buf[j],mon2);
  868.                         break;
  869.             default:    buf[j] = s[i]; k = 1; break;
  870.             }
  871.             j += k;
  872.             continue;
  873.         }
  874.         if(s[i] == '\\' && s[i+1] == 'n') {
  875.             buf[j++] = '\n';
  876.             i++;
  877.             continue;
  878.         }
  879.         if(s[i] == '^') {
  880.             c = s[++i];
  881.             if(c >= '@' && c <= '_') {
  882.                 if(c == '^') buf[j++] = c;
  883.                 else         buf[j++] = c - '@';
  884.             }
  885.             else {
  886.                 buf[j++] = '^';
  887.                 buf[j++] = c;
  888.             }
  889.             continue;
  890.         }
  891.         buf[j++] = s[i];
  892.     }
  893.     if(mode && strlen(buf) && buf[j-1] != '\n')
  894.         buf[j++] = '\n';
  895.     buf[j] = 0;
  896.     if(fputsub(buf,fd1,fname)) return(0);
  897.     return(strlen(buf));
  898. }
  899.  
  900. static int hatugen(PCELL far *tcu,int no)    /* 発言出力 */
  901. {
  902.     FILE *fd1;
  903.     char fname[53],buf[161],sys[161],*s;
  904.     int i,k,mode,l;
  905.     PCELL far *pt;
  906.     PCELL far *w;
  907.  
  908.     if(tcu->mode == NEND)
  909.         return(0);
  910.     if(!no) sprintf(buf, "発言先ファイル名 = ");
  911.     else    sprintf(buf, "発言2先ファイル名 = ");
  912.     fname[0] = 50;
  913.     strcpy(&fname[2],hatudir);
  914.     cgetfsx(buf, fname);
  915.     if(!fname[2]) {
  916.         return(0);
  917.     }
  918.     if(!(fd1 = fopen_sub(&fname[2],1)))
  919.         return(0);
  920.     memset(buf,0,101);
  921.     hatutitle[0] = 0;
  922.     tbl_set(tcu);
  923.     _fmemcpy((char far *)hatunifid,tcu->p->nifid,8);
  924.     memset(hatuhpid,0,9);
  925.     hatuheyano[0] = 0;
  926.     sprintf(hatucmtno,"%d",tcu->p->id);
  927.     if(tcu->flag & FCYCLE) sprintf(hatucmtno2,"%05u",tcu->p->id);
  928.     else                   sprintf(hatucmtno2,"%03d",tcu->p->id);
  929.     hatuforum[0] = 0;
  930.     hatuhandle[0] = 0;
  931.     switch(tcu->mode) {
  932.     case NHP:
  933.         mode = 0;
  934.         if(!strlen(hatutop[no][0])) break;
  935.         w = tcu->grp;
  936.         tbl_set(w);
  937.         _fstrcpy((char far *)buf,w->p->title);
  938.         if(isalpha(buf[9])) strncpy(hatuhpid,&buf[9],8);
  939.         _fstrcpy((char far *)hatutitle,&buf1[0][37]);
  940.         if(!sethatu(hatutop[no][0],fd1,fname,1)) return(0);
  941.         break;
  942.     case NMAIL:
  943.         mode = 1;
  944.         if(!strlen(hatutop[no][1])) break;
  945.         if(buf1[0][0] == '-') {        /* air craft mail ? */
  946.             _fstrcpy((char far *)hatutitle,&buf1[2][10]);
  947.             _fstrncpy((char far *)buf,&buf1[1][4],18);
  948.         }
  949.         else {
  950.             _fstrcpy((char far *)hatutitle,&buf1[1][10]);
  951.             _fstrncpy((char far *)buf,&buf1[0][4],18);
  952.         }
  953.         for(i=17;i;i--) {
  954.             if(buf[i] == ' ') continue;
  955.             if(iskanji(buf[i-1])) {
  956.                 k = (buf[i] * 256) + buf[i-1];
  957.                 if(k == ' ') {
  958.                     i--;
  959.                     continue;
  960.                 }
  961.                 break;
  962.             }
  963.             break;
  964.         }
  965.         buf[i+1] = 0;
  966.         strcpy(hatuhandle,buf);
  967.         hatunifid[8] = 0;
  968.         if(!sethatu(hatutop[no][1],fd1,fname,1)) return(0);
  969.         break;
  970.     case NFORUM:
  971.         mode = 2;
  972.         if(!strlen(hatutop[no][2])) break;
  973.         if(!(tcu->flag & FCYCLE)) {
  974.             _fstrcpy((char far *)hatutitle,&buf1[0][38]);
  975.             _fstrncpy((char far *)buf,&buf1[0][20],18);
  976.         }
  977.         else {
  978.             _fstrcpy((char far *)hatutitle,&buf1[0][39]);
  979.             _fstrncpy((char far *)buf,&buf1[0][22],17);
  980.         }
  981.         for(i=17;i;i--) {
  982.             if(!buf[i] || buf[i] == ' ') continue;
  983.             if(iskanji(buf[i-1])) {
  984.                 k = (buf[i] * 256) + buf[i-1];
  985.                 if(k == ' ') {
  986.                     i--;
  987.                     continue;
  988.                 }
  989.                 break;
  990.             }
  991.             break;
  992.         }
  993.         buf[i+1] = 0;
  994.         strcpy(hatuhandle,buf);
  995.         _fstrcpy((char far *)buf,&buf1[1][0]);
  996.         s = jstrchr(buf,'(');
  997.         s[3] = 0;
  998.         if(s[1] == ' ') strcpy(hatuheyano,&s[2]);
  999.         else            strcpy(hatuheyano,&s[1]);
  1000.         pt = tcu->grp;
  1001.         tbl_set(pt);
  1002.         _fstrcpy((char far *)buf,pt->p->title);
  1003.         xstrncpy(hatuforum,&buf[2]);
  1004.         if(!sethatu(hatutop[no][2],fd1,fname,1)) return(0);
  1005.         break;
  1006.     case NBBS:
  1007.     case NFBBS:
  1008.         mode = 3;
  1009.         if(!strlen(hatutop[no][3])) break;
  1010.         _fstrcpy((char far *)hatutitle,&buf1[0][30]);
  1011.         if(!sethatu(hatutop[no][3],fd1,fname,1)) return(0);
  1012.         break;
  1013.     default:
  1014.         mode = 4;
  1015.     }
  1016.     if(strcmp(messtring[no][mode],"$d")) {
  1017.         memset(sys,0,81);
  1018.         for(k=0;buf1[k];k++) {
  1019.             if(mode <= 3 && strlen(messtring[no][mode])) {
  1020.                 if(!(i=sethatu(messtring[no][mode],fd1,fname,0))) return(0);
  1021.                 memset(buf,0,81);
  1022.                 strcpy(buf,sys);
  1023.                 _fstrcpy((char far *)sys,buf1[k]);
  1024.                 l = strlen(sys);
  1025.                 strcat(buf,sys);
  1026.                 memset(sys,0,81);
  1027.                 if(i+l > 77) {
  1028.                     l = 77-i;
  1029.                     if(buf[l] != '\n') {
  1030.                         if(nthctype(buf,l-1) == CT_KJ1)
  1031.                             l++;
  1032.                         strcpy(sys,&buf[l]);
  1033.                         buf[l] = 0;
  1034.                         strcat(buf,"\n");
  1035.                     }
  1036.                 }
  1037.                 if(fputsub(buf,fd1,fname)) return(0);
  1038.                 if(strchr(sys,'\n')) {
  1039.                     if(!(i=sethatu(messtring[no][mode],fd1,fname,0)))
  1040.                         return(0);
  1041.                     if(fputsub(sys,fd1,fname)) return(0);
  1042.                     memset(sys,0,81);
  1043.                 }
  1044.             }
  1045.             else {
  1046.                 _fstrcpy((char far *)buf,buf1[k]);
  1047.                 if(fputsub(buf,fd1,fname)) return(0);
  1048.             }
  1049.         }
  1050.     }
  1051.     if(mode <= 3) {
  1052.         if(strlen(hatuend[no][mode])) {
  1053.             if(!sethatu(hatuend[no][mode],fd1,fname,1)) return(0);
  1054.         }
  1055.     }
  1056.     fclose(fd1);
  1057.     if(!strstr(editer,"$p")) sprintf(sys,"%s %s",editer,&fname[2]);
  1058.     else {
  1059.         s = editer;
  1060.         for(i=l=0;s[i];i++) {
  1061.             if(iskanji(s[i]) && iskanji2(s[i+1])) {
  1062.                 sys[l++] = s[i++];
  1063.                 sys[l++] = s[i];
  1064.                 continue;
  1065.             }
  1066.             if(s[i] == '$') {
  1067.                 switch(s[++i]) {
  1068.                 case 'p':    k = sethatusub(&sys[l],&fname[2]);
  1069.                             break;
  1070.                 case 'l':    k = sethatusub(&sys[l],linework);
  1071.                             break;
  1072.                 default:    sys[l] = s[i]; k = 1; break;
  1073.                 }
  1074.                 l += k;
  1075.                 continue;
  1076.             }
  1077.             sys[l++] = s[i];
  1078.         }
  1079.         sys[l] = 0;
  1080.     }
  1081.     systemcall(sys,"");
  1082.     xxstrncpy50(hatudir,&fname[2]);
  1083.     return(1);
  1084. }
  1085.  
  1086. static PCELL far *work_top;
  1087. static PCELL far *work_tail;
  1088. static PCELL far *free_top;
  1089. static PCELL far *free_tail;
  1090. static PCELL far *cmt_top;
  1091. static PCELL far *cmt_tail;
  1092. static char cmt_tbl[41];
  1093.  
  1094. static void cmtfree(PCELL far *d)    /* セル返却 */
  1095. {
  1096.     tbl_free(d);
  1097. }
  1098.  
  1099. static void cmtdelete(PCELL far *d)    /* タイトルキュー取り外し */
  1100. {
  1101.     if(p_top == d) {
  1102.         p_top = d->next;
  1103.         if(!p_top) p_tail = (PCELL far *)0;
  1104.         else p_top->back = (PCELL far *)0;
  1105.     }
  1106.     else if(p_tail == d) {
  1107.         p_tail = d->back;
  1108.         if(!p_tail) p_top = (PCELL far *)0;
  1109.         else p_tail->next = (PCELL far *)0;
  1110.     }
  1111.     else {
  1112.         d->next->back = d->back;
  1113.         d->back->next = d->next;
  1114.     }
  1115.     d->next = d->back = (PCELL far *)0;
  1116. }
  1117.  
  1118. static void cmtdelete1(PCELL far *d) /* 作業キュー取り外し */
  1119. {
  1120.     if(work_top == d) {
  1121.         work_top = d->next;
  1122.         if(!work_top) work_tail = (PCELL far *)0;
  1123.         else work_top->back = (PCELL far *)0;
  1124.     }
  1125.     else if(work_tail == d) {
  1126.         work_tail = d->back;
  1127.         if(!work_tail) work_top = (PCELL far *)0;
  1128.         else work_tail->next = (PCELL far *)0;
  1129.     }
  1130.     else {
  1131.         d->next->back = d->back;
  1132.         d->back->next = d->next;
  1133.     }
  1134.     d->next = d->back = (PCELL far *)0;
  1135. }
  1136.  
  1137. static void cmtset(PCELL far *w,PCELL far *d)    /* セル接続 */
  1138. {
  1139.     w->next->back = d;
  1140.     d->next = w->next;
  1141.     d->back = w;
  1142.     w->next = d;
  1143. }
  1144.  
  1145. PCELL far *cmtsepa(PCELL far *a)    /* セパレータセル作成 */
  1146. {
  1147.     PCELL far *pt;
  1148.     char far *t;
  1149.     int i;
  1150.  
  1151.     if(sepamode) return((PCELL far *)-1);
  1152.     pt = tbl_alloc(0);
  1153.     if(!pt) {
  1154.         errdisp1(memgeterror);
  1155.         return((PCELL far *)-1);
  1156.     }
  1157.     pt->mode = NSEPA;
  1158.     tbl_set(a);
  1159.     i = a->p->fno;
  1160.     tbl_set(pt);
  1161.     pt->p->fno = i;
  1162.     pt->grp = a;
  1163.     _fstrcpy(pt->p->title,(char far *)spalate);
  1164.     return(pt);
  1165. }
  1166.  
  1167. static int cmtsort1(PCELL far *a,int mode)    /* 作業キューへの接続 */
  1168. {
  1169.     PCELL far *w;
  1170.     int i,j;
  1171.  
  1172.     w = work_tail;
  1173.     if(work_top && mode) {
  1174.         for(;w;w=w->back) {
  1175.             tbl_set(w);
  1176.             j = w->p->id;
  1177.             tbl_set(a);
  1178.             i = a->p->id - j;
  1179.             if(i < 0) continue;
  1180.             if(i > 0) break;
  1181.             return(0);
  1182.         }
  1183.     }
  1184.     if(!work_top) {
  1185.         work_top = work_tail = a;
  1186.         a->next = a->back = (PCELL far *)0;
  1187.     }
  1188.     else if(!w) {
  1189.         a->next = work_top;
  1190.         work_top->back = a;
  1191.         work_top = a;
  1192.         a->back = (PCELL far *)0;
  1193.     }
  1194.     else if(!w->next) {
  1195.         w->next = work_tail = a;
  1196.         a->next = (PCELL far *)0;
  1197.         a->back = w;
  1198.     }
  1199.     else {
  1200.         a->next = w->next;
  1201.         w->next = a;
  1202.         a->back = w;
  1203.         a->next->back = a;
  1204.     }
  1205.     return(1);
  1206. }
  1207.  
  1208. static int cmtsort11(PCELL far *a)    /* コメントキューへの接続 */
  1209. {
  1210.     PCELL far *w;
  1211.  
  1212.     w = cmt_tail;
  1213.     if(!cmt_top) {
  1214.         cmt_top = cmt_tail = a;
  1215.         a->next = a->back = (PCELL far *)0;
  1216.     }
  1217.     else if(!w->next) {
  1218.         w->next = cmt_tail = a;
  1219.         a->next = (PCELL far *)0;
  1220.         a->back = w;
  1221.     }
  1222.     else {
  1223.         a->next = w->next;
  1224.         w->next = a;
  1225.         a->back = w;
  1226.         a->next->back = a;
  1227.     }
  1228.     return(1);
  1229. }
  1230.  
  1231. static void cmtsort12(PCELL far *a)    /* フリーキューへの接続 */
  1232. {
  1233.     PCELL far *w;
  1234.  
  1235.     if(!(a->flag & FSAKUJYO)) {
  1236.         a->flag |= FSAKUJYO;
  1237.         sakujyono++;
  1238.     }
  1239.     w = free_tail;
  1240.     if(!free_top) {
  1241.         free_top = free_tail = a;
  1242.         a->next = a->back = (PCELL far *)0;
  1243.     }
  1244.     else if(!w->next) {
  1245.         w->next = free_tail = a;
  1246.         a->next = (PCELL far *)0;
  1247.         a->back = w;
  1248.     }
  1249.     else {
  1250.         a->next = w->next;
  1251.         w->next = a;
  1252.         a->back = w;
  1253.         a->next->back = a;
  1254.     }
  1255. }
  1256.  
  1257. static void cmtsort2(PCELL far *a,int c) /* コメントツリーソート処理 */
  1258. {
  1259.     PCELL far *pt;
  1260.     int j,l;
  1261.  
  1262.     tbl_set(a);
  1263.     j = a->p->id;
  1264.     pt=a->next;
  1265.     cmtdelete1(a);
  1266.     cmtsort11(a);
  1267.     l = 0;
  1268.     for(;pt;) {
  1269.         tbl_set(pt);
  1270.         if(pt->p->cid == j) {
  1271.             l++;
  1272.             cmtsort2(pt,c+1);
  1273.             pt=work_top;
  1274.         }
  1275.         else pt = pt->next;
  1276.     }
  1277.     tbl_set(a);
  1278.     a->p->cno = l;
  1279.     a->p->cmt = c;
  1280. }
  1281.  
  1282. static PCELL far *
  1283. cmttitleset(PCELL far *a,int n)    /* タイトルツリー文字列セット */
  1284. {
  1285.     PCELL far *pt;
  1286.     int l,c;
  1287.     char *b,*buf,*w;
  1288.  
  1289.     pt=a;
  1290.     for(;n;n--) {
  1291.         tbl_set(pt);
  1292.         buf = (char *)malloc(81);
  1293.         w = (char *)malloc(81);
  1294.         if(buf && w) {
  1295.             c=pt->p->cmt;
  1296.             b = &cmt_tbl[c*2];
  1297.             if(c == 20) strcpy(b,&treechar[9]);
  1298.             else if(c < 20) {
  1299.                 if(n > 1) strcpy(b,&treechar[0]);
  1300.                 else      strcpy(b,&treechar[3]);
  1301.             }
  1302.             strcpy(buf,cmt_tbl);
  1303.             _fstrcpy((char far *)w,pt->p->title);
  1304.             if(!(pt->flag & FCYCLE)) {
  1305.                 *(w+3) = 0;
  1306.                 strcat(buf,w);
  1307.                 if(titlemode)
  1308.                     strncat80(buf,(w+22));
  1309.                 else
  1310.                     strncat80(buf,(w+19));
  1311.             }
  1312.             else {
  1313.                 *(w+5) = 0;
  1314.                 strcat(buf,w);
  1315.                 if(titlemode)
  1316.                     strncat80(buf,(w+24));
  1317.                 else
  1318.                     strncat80(buf,(w+21));
  1319.             }
  1320.             str79set(buf);
  1321. /*            _fstrcpy(pt->p->title2,pt->p->title); */
  1322.             _fstrcpy(pt->p->title,(char far *)buf);
  1323.             free(buf);
  1324.             free(w);
  1325.         }
  1326.         else {
  1327.             errdisp1(memgeterror);
  1328.             if(buf) free(buf);
  1329.         }
  1330.         pt->flag |= FDISP;
  1331.         l = pt->p->cno;
  1332.         pt=pt->next;
  1333.         if(l) {
  1334.             if(c < 20) {
  1335.                 if(n > 1) strcpy(b,&treechar[6]);
  1336.                 else      strcpy(b," ");
  1337.             }
  1338.             pt=cmttitleset(pt,l);
  1339.         }
  1340.     }
  1341.     return(pt);
  1342. }
  1343.  
  1344. static void cmtsort(char mode) /* 昇順ソート処理 mode =NHP,=NFORUM,=NMAIL */
  1345. {
  1346.     PCELL far *a = (PCELL far *)0;
  1347.     PCELL far *w = (PCELL far *)0;
  1348.     PCELL far *wk;
  1349.     char mode1,mode2=0,*s,buf[81],buf1[81];
  1350.     int i;
  1351.  
  1352.     work_top=work_tail=(PCELL far *)0;
  1353.     free_top=free_tail=(PCELL far *)0;
  1354.  
  1355.     switch(mode) {
  1356.     case NHP:     mode1 = NHPHEAD; i = 1;break;
  1357.     case NFORUM: mode1 = NMESHEAD; i = 1;break;
  1358.     default:     mode1 = NMAILHEAD; mode2 = NMWRITE; i = 0;break;
  1359.     }
  1360.     tbl_set(p_head);
  1361.     _fstrcpy((char far *)buf,p_head->p->title);
  1362.     if(s = jstrchr(buf,':')) *s = 0;
  1363.     for(a = p_head->next;a->mode != NEND;a = w) {
  1364.         w = a->next;
  1365.         if(a->grp->mode == mode1) {
  1366.             wk = a->grp;
  1367.             tbl_set(wk);
  1368.             _fstrcpy((char far *)buf1,wk->p->title);
  1369.             if(s = jstrchr(buf1,':')) *s = 0;
  1370.             if(strcmp(buf,buf1)) continue;
  1371.             if(a->mode == NSEPA) {
  1372.                 cmtdelete(a);
  1373.                 cmtfree(a);
  1374.                 continue;
  1375.             }
  1376.             else {
  1377.                 if(a->mode != mode && a->mode != mode2) continue;
  1378.             }
  1379.         }
  1380.         else continue;
  1381.         if(p_head != a->grp) {
  1382.             if(!(a->grp->flag & FSAKUJYO)) {
  1383.                 a->grp->flag |= FSAKUJYO;
  1384.                 sakujyono++;
  1385.             }
  1386.             a->grp = p_head;
  1387.         }
  1388.         cmtdelete(a);
  1389.         a->flag |= FDISP;
  1390.         if(!cmtsort1(a,i))
  1391.             cmtsort12(a);
  1392.     }
  1393. }
  1394.  
  1395. static void comentclr(void)    /* コメント絞り込み解除 */
  1396. {
  1397.     PCELL far *pt;
  1398.     PCELL far *ppt;
  1399.     PCELL far *a;
  1400.     int i,x;
  1401.     char buf[81],buf3[81],bufwork[81];
  1402.  
  1403.     if(nifmode == NFCOMENTID) {
  1404.         for(pt=p_top,i=1;pt;pt=pt->next,i++)
  1405.             pt->count = i;
  1406.     }
  1407.     if(nifmode == NFCOMENT || nifmode == NFCOMENTID) {
  1408.         xlocate();
  1409.         kprintf("只今、コメントツリー解除処理中です。");
  1410. /*        grh_disp("コメントツリー解除処理中",0); */
  1411.         for(ppt=p_top;ppt->mode != NEND;ppt=ppt->next) {
  1412. /*            if(!(ppt->count % 10)) grh_sub(ppt->count,p_tail->count); */
  1413.             if(ppt->mode == NMESHEAD) {
  1414.                 p_head = ppt;
  1415.                 cmtsort(NFORUM);
  1416.                 for(i=0,pt=work_top;pt;pt=pt->next) {
  1417. /*                    if(!(pt->count % 10)) grh_sub(pt->count,p_tail->count); */
  1418.                     tbl_set(pt);
  1419.                     if(i && (i+1 != pt->p->id)) {
  1420.                         if((a = cmtsepa(p_head)) != (PCELL far *)-1) {
  1421.                             cmtset(pt->back,a);
  1422.                         }
  1423.                     }
  1424.                     tbl_set(pt);
  1425.                     i = pt->p->id;
  1426.                     if(pt->mode == NFORUM) {
  1427. /*                        _fstrcpy(pt->p->title,pt->p->title2); */
  1428.                         xxfseek(pt,pt->p->top);
  1429.                         xfgets(buf,81);
  1430.                         rtncut(buf);
  1431.                         xfgets(buf3,81);
  1432.                         rtncut(buf3);
  1433.                         memset(bufwork,0,81);
  1434.                         if(titlemode) {
  1435.                             if(pt->flag & FCYCLE) {
  1436.                                 strncpy(bufwork,buf,5);
  1437.                                 strncat(bufwork,&buf3[6],9);
  1438.                                 strncat80(bufwork,&buf[11]);
  1439.                             }
  1440.                             else {
  1441.                                 strncpy(bufwork,buf,3);
  1442.                                 strncat(bufwork,&buf3[6],9);
  1443.                                 strncat80(bufwork,&buf[9]);
  1444.                             }
  1445.                         }
  1446.                         else strcpy(bufwork,buf);
  1447.                         _fstrcpy(pt->p->title,(char far *)bufwork);
  1448.                     }
  1449.                 }
  1450.                 if(free_top) {
  1451.                     if((a = cmtsepa(p_head)) != (PCELL far *)-1)
  1452.                         cmtsort1(a,0);
  1453.                     if(work_top) {
  1454.                         work_tail->next = free_top;
  1455.                         free_top->back = work_tail;
  1456.                     }
  1457.                     else work_top = free_top;
  1458.                     work_tail = free_tail;
  1459.                 }
  1460.                 if(work_top) {
  1461.                     p_head->next->back = work_tail;
  1462.                     work_tail->next = p_head->next;
  1463.                     p_head->next = work_top;
  1464.                     work_top->back = p_head;
  1465.                 }
  1466.             }
  1467.             else if(ppt->mode == NHPHEAD) {
  1468.                 p_head = ppt;
  1469.                 cmtsort(NHP);
  1470.                 for(i=0,pt=work_top;pt;pt=pt->next) {
  1471.                     tbl_set(pt);
  1472.                     if(i && (i+1 != pt->p->id)) {
  1473.                         if((a = cmtsepa(p_head)) != (PCELL far *)-1) {
  1474.                             cmtset(pt->back,a);
  1475.                         }
  1476.                     }
  1477.                     tbl_set(pt);
  1478.                     i = pt->p->id;
  1479.                 }
  1480.                 if(free_top) {
  1481.                     if((a = cmtsepa(p_head)) != (PCELL far *)-1)
  1482.                         cmtsort1(a,0);
  1483.                     if(work_top) {
  1484.                         work_tail->next = free_top;
  1485.                         free_top->back = work_tail;
  1486.                     }
  1487.                     else work_top = free_top;
  1488.                     work_tail = free_tail;
  1489.                 }
  1490.                 if(work_top) {
  1491.                     p_head->next->back = work_tail;
  1492.                     work_tail->next = p_head->next;
  1493.                     p_head->next = work_top;
  1494.                     work_top->back = p_head;
  1495.                 }
  1496.             }
  1497.         }
  1498.     }
  1499.     for(pt=p_top,i=1;pt;pt=pt->next,i++) {
  1500.         pt->count = i;
  1501.         pt->flag &= ~FDISP;
  1502.     }
  1503. /*    grh_sub(1,1); */
  1504.     p_head = p_top;
  1505.     nifmode = NFNORMAL;
  1506.     pfset();
  1507. }
  1508.  
  1509. static void totalset(int mode)    /* 絞り込み時のタイトル絞り込み */
  1510. {
  1511.     PCELL far *pt;
  1512.     int j;
  1513.  
  1514.     for(pt=p_top,j = 1;pt->mode != NEND;pt=pt->next) {
  1515.         if(mode || pt->flag & FDISP) {
  1516.             if(j == 1) p_head = pt;
  1517.             pt->count = j++;
  1518.             pt->flag &= ~FDISP;
  1519.         }
  1520.         else pt->count = 0;
  1521.     }
  1522.     pt->count = j;
  1523. }
  1524.  
  1525. static int subsearch(char *buf3,int mode) /* 検索サブ */
  1526. {
  1527.     char buf[161],buf2[81],buf4[81],*b,*c;
  1528.     int i,count = 0,e = 0;
  1529.  
  1530.     _fstrcpy((char far *)buf,buf1[0]);
  1531.     rtncut(buf);
  1532.     for(i=0;;i++) {
  1533.         if(!buf1[i] || e) break;
  1534.         c = buf + strlen(buf);
  1535.         _fstrcpy((char far *)buf2,buf1[i+1]);
  1536.         if(strlen(buf2)) {
  1537.             rtncut(buf2);
  1538.             memcpy(buf4,buf2,81);
  1539.             strncat(buf,buf2,160-strlen(buf));
  1540.         }
  1541.         else {
  1542.             e = 1;
  1543.         }
  1544.         if(mode) fbuf1[i] = 0;
  1545.         for(b = buf;b < c;) {
  1546.             if(!(b = substrstr(b,buf3)) || b >= c) break;
  1547.             b += rtnk;
  1548.             count++;
  1549.             if(mode) fbuf1[i] = 1;
  1550.         }
  1551.         memcpy(buf,buf4,81);
  1552.     }
  1553.     return(count);
  1554. }
  1555.  
  1556. static int shsub(char *buf3)    /* 検索文字列入力 */
  1557. {
  1558.     xlocate();
  1559.     kprintf("検索文字列を入力 = ");
  1560.     memset(buf3,0,43);
  1561.     buf3[0] = 40;
  1562.     strcpy(&buf3[2],kensakumoji);
  1563.     cgetsx(buf3,0);
  1564.     xlocate();
  1565.     if(!buf3[2] || buf3[2] == 0x1b) {
  1566.         return(0);
  1567.     }
  1568.     rtncut(&buf3[2]);
  1569.     strcpy(kensakumoji,&buf3[2]);
  1570.     return(1);
  1571. }
  1572.  
  1573. static int search(int mode)        /* 検索 */
  1574. {
  1575.     PCELL far *pt;
  1576.     char buf[81],buf3[43];
  1577.     int count = 0,mcount = 0,andormode = 0,i;
  1578.  
  1579.     xhpread(MAXPOINT);
  1580.     if(!mode && nifmode == NFSEARCH) {
  1581.         if(!yesnocheck("AND検索を行いますか")) andormode = 1;
  1582.     }
  1583.     if(!shsub(buf3)) return(0);
  1584.     if(mode) {
  1585.         kprintf(srcmsg);
  1586.         count = subsearch(&buf3[2],1);
  1587.         if(count) {
  1588.             sprintf(buf,"「%s」が%d件あります",&buf3[2],count);
  1589.             errdisp1(buf);
  1590.             return(1);
  1591.         }
  1592.         sprintf(buf,"「%s」が見つかりません",&buf3[2]);
  1593.         errdisp1(buf);
  1594.         return(0);
  1595.     }
  1596.     if(nifmode == NFCOMENT || nifmode == NFCOMENTID) {
  1597.         comentclr();
  1598.     }
  1599.     xlocate();
  1600.     if(!andormode) {
  1601.         grh_dispx("AND検索処理中",1);
  1602.         for(pt=p_head;pt->mode != NEND;pt=pt->next) {
  1603.             if(pt->count) {
  1604.                 tbl_set(pt);
  1605.                 if(pt->p->top == pt->p->tail)
  1606.                     continue;
  1607. /*                xlocate();
  1608.                 sprintf(buf,"只今、%d/%dタイトル目を検索中です。",pt->count,p_tail->count-1);
  1609.                 kprintf(buf); */
  1610.                 bunget(pt,1);
  1611.                 count = subsearch(&buf3[2],0);
  1612.                 bunbuffree();
  1613.                 tbl_set(pt);
  1614.                 if(count) {
  1615.                     pt->flag |= FDISP;
  1616.                     pt->p->cmt = count;
  1617.                     mcount++;
  1618.                 }
  1619.                 else {
  1620.                     pt->flag &= ~FDISP;
  1621.                     pt->p->cmt = 0;
  1622.                 }
  1623.             }
  1624.             if(keycheck() && getch() == 0x1b) break;
  1625.             if(!(pt->count % 10)) grh_sub(pt->count,p_tail->count-1);
  1626.         }
  1627.     }
  1628.     else {
  1629.         grh_dispx("OR検索処理中",1);
  1630.         for(i=1,pt=p_top;pt->mode != NEND;pt=pt->next) {
  1631.             tbl_set(pt);
  1632.             if(pt->p->top != pt->p->tail) {
  1633. /*                xlocate();
  1634.                 sprintf(buf,"只今、%d/%dタイトル目を検索中です。",i,p-1);
  1635.                 kprintf(buf); */
  1636.                 bunget(pt,1);
  1637.                 count = subsearch(&buf3[2],0);
  1638.                 bunbuffree();
  1639.                 tbl_set(pt);
  1640.                 if(count) {
  1641.                     pt->flag |= FDISP;
  1642.                     pt->p->cmt += count;
  1643.                     mcount++;
  1644.                 }
  1645.                 else {
  1646.                     if(pt->count) {
  1647.                         pt->flag |= FDISP;
  1648.                         mcount++;
  1649.                     }
  1650.                     else {
  1651.                         pt->flag &= ~FDISP;
  1652.                         pt->p->cmt = 0;
  1653.                     }
  1654.                 }
  1655.             }
  1656.             if(keycheck() && getch() == 0x1b) break;
  1657.             if(!(i % 10)) grh_sub(i++,p-1);
  1658.         }
  1659.     }
  1660.     grh_sub(1,1);
  1661.     if(mcount) {
  1662.         totalset(0);
  1663.         nifmode = NFSEARCH;
  1664.         pfset();
  1665.         sprintf(buf,"%dタイトルで発見",mcount);
  1666.         errdisp1(buf);
  1667.         return(1);
  1668.     }
  1669.     sprintf(buf,"「%s」が見つかりません",&buf3[2]);
  1670.     errdisp1(buf);
  1671.     return(0);
  1672. }
  1673.  
  1674. static PCELL far *coment(PCELL far *tcu,int mode)    /* コメント */
  1675. {
  1676.     PCELL far *pt;
  1677.     int i;
  1678.     char *s,buf[81],buf1[81];
  1679.  
  1680.     if(nifmode != NFNORMAL) {
  1681.         comentclr();
  1682.         return(tcu);
  1683.     }
  1684.     if ( !mode && (tcu->grp->mode != NMESHEAD    /* フォーラム会議室タイトル */
  1685.      && tcu->grp->mode != NHPHEAD                /* HPタイトル */
  1686.      && tcu->grp->mode != NMAILHEAD                /* 電子メールタイトル */
  1687.      || tcu->mode == NHPWRITE                    /* HPの送信 */
  1688.      || tcu->mode == NMWRITE                    /* 電子メールの送信 */
  1689.      || tcu->mode == NFWRITE)) {                /* フォーラムの送信 */
  1690.         errdisp1(notcomenterror);
  1691.         return((PCELL far *)0);
  1692.     }
  1693.     xlocate();
  1694.     kprintf("只今、コメントツリー作成処理中です。");
  1695.     xhpread(MAXPOINT);
  1696.     for(;tcu->mode == NSEPA;tcu = tcu->back) {
  1697.         ;
  1698.     }
  1699.     for(pt = p_top;pt->mode != NEND;pt=pt->next) {
  1700.         if(pt->mode == NMAILHEAD) {
  1701.             p_head = pt;
  1702.             cmtsort(NMAIL);
  1703.             if(free_top) {
  1704.                 if(work_top) {
  1705.                     work_tail->next = free_top;
  1706.                     free_top->back = work_tail;
  1707.                 }
  1708.                 else work_top = free_top;
  1709.                 work_tail = free_tail;
  1710.             }
  1711.             if(work_top) {
  1712.                 p_head->next->back = work_tail;
  1713.                 work_tail->next = p_head->next;
  1714.                 p_head->next = work_top;
  1715.                 work_top->back = p_head;
  1716.                 pt = work_tail;
  1717.             }
  1718.             p_head->flag |= FDISP;
  1719.         }
  1720.     }
  1721.     for(pt = p_top;pt->mode != NEND;pt=pt->next) {
  1722.         if(pt->mode == NHPHEAD) {
  1723.             p_head = pt;
  1724.             cmtsort(NHP);
  1725.             if(free_top) {
  1726.                 if(work_top) {
  1727.                     work_tail->next = free_top;
  1728.                     free_top->back = work_tail;
  1729.                 }
  1730.                 else work_top = free_top;
  1731.                 work_tail = free_tail;
  1732.             }
  1733.             if(work_top) {
  1734.                 p_head->next->back = work_tail;
  1735.                 work_tail->next = p_head->next;
  1736.                 p_head->next = work_top;
  1737.                 work_top->back = p_head;
  1738.                 pt = work_tail;
  1739.             }
  1740.             p_head->flag |= FDISP;
  1741.         }
  1742.     }
  1743.     for(pt = p_top;pt->mode != NEND;pt=pt->next) {
  1744.         if(pt->mode == NMESHEAD) {
  1745.             p_head = pt;
  1746.             cmtsort(NFORUM);
  1747.             cmt_top=cmt_tail=(PCELL far *)0;
  1748.             for(i=0;work_top;i++)
  1749.                 cmtsort2(work_top,0);
  1750.             memset(cmt_tbl,0,41);
  1751.             if(cmt_top) {
  1752.                 cmttitleset(cmt_top,i);
  1753.                 if(free_top) {
  1754.                     for(pt=free_top;pt;pt=pt->next)
  1755.                         pt->flag |= FDISP;
  1756.                     cmt_tail->next = free_top;
  1757.                     free_top->back = cmt_tail;
  1758.                     cmt_tail = free_tail;
  1759.                 }
  1760.                 p_head->next->back = cmt_tail;
  1761.                 cmt_tail->next = p_head->next;
  1762.                 p_head->next = cmt_top;
  1763.                 cmt_top->back = p_head;
  1764.                 pt = cmt_tail;
  1765.             }
  1766.             p_head->flag |= FDISP;
  1767.         }
  1768.     }
  1769.     if((startmode & 0x0e) == 6) totalset(1);
  1770.     else                        totalset(0);
  1771.     nifmode = NFCOMENT;
  1772.     pfset();
  1773.     if(!tcu) {
  1774.         if(p_tail->count == 1)
  1775.             comentclr();
  1776.         return(p_head);
  1777.     }
  1778.     if(p_tail->count == 1) {
  1779.         comentclr();
  1780.         errdisp1("コメント機能の対象となるデータがありません");
  1781.         return((PCELL far *)0);
  1782.     }
  1783.     if(!tcu->count) {
  1784.         for(tcu=tcu->back;tcu && tcu->count != 1;tcu=tcu->back) {
  1785.              if(tcu->count)
  1786.                  break;
  1787.         }
  1788.         if(!tcu) return(p_head);
  1789.     }
  1790.     return(tcu);
  1791. }
  1792.  
  1793. static PCELL far *comentid(PCELL far *tcu)    /* コメント+ID */
  1794. {
  1795.     PCELL far *pt;
  1796.     PCELL far *ppt;
  1797.     int i,savemode;
  1798.  
  1799.     tbl_set(tcu);
  1800.     if(!tcu->p->nifid[0]) {
  1801.         errdisp1(notcomenterror);
  1802.         return((PCELL far *)0);
  1803.     }
  1804.     xhpread(MAXPOINT);
  1805.     memset(nifid,0,9);
  1806.     tbl_set(tcu);
  1807.     _fmemcpy(nifid,tcu->p->nifid,8);
  1808.     if(nifmode != NFNORMAL)
  1809.         comentclr();
  1810.     savemode = startmode;
  1811.     startmode = 6;
  1812.     coment(0,1);
  1813.     startmode = savemode;
  1814.     for(pt=p_top;pt->mode != NEND;pt=pt->next) {
  1815.         if(!pt->count) continue;
  1816.         tbl_set(pt);
  1817.         if(pt->mode == NFORUM && !pt->p->cmt) {
  1818.             for(i=0,ppt = pt;ppt->mode == NFORUM;) {
  1819.                 tbl_set(ppt);
  1820.                 if(!_fmemcmp(nifid,ppt->p->nifid,8)) {
  1821.                     i = 1;
  1822.                     break;
  1823.                 }
  1824.                 ppt=ppt->next;
  1825.                 tbl_set(ppt);
  1826.                 if(!ppt->p->cmt) break;
  1827.             }
  1828.             if(i) {
  1829.                 for(ppt = pt;ppt->mode == NFORUM;) {
  1830.                     tbl_set(ppt);
  1831.                     ppt->flag |= FDISP;
  1832.                     ppt=ppt->next;
  1833.                     tbl_set(ppt);
  1834.                     if(!ppt->p->cmt) break;
  1835.                 }
  1836.             }
  1837.             pt = ppt->back;
  1838.             continue;
  1839.         }
  1840.         if(!_fmemcmp(nifid,pt->p->nifid,8)) {
  1841.             pt->flag |= FDISP;
  1842.         }
  1843.     }
  1844.     totalset(0);
  1845.     nifmode = NFCOMENTID;
  1846.     pfset();
  1847.     return(tcu);
  1848. }
  1849.  
  1850. static int sentaku(PCELL far *tcu)    /* 選択 */
  1851. {
  1852.     if(tcu->mode == NEND)
  1853.         return(0);
  1854. /*    if(tcu->mode == NSEPA) */
  1855.     tbl_set(tcu);
  1856.     if(tcu->p->top == tcu->p->tail)
  1857.         return(1);
  1858.     if(tcu->flag & FSENTAKU) {
  1859.         tcu->flag &= ~FSENTAKU;
  1860.         sentakuno--;
  1861.         return(1);
  1862.     }
  1863.     tcu->flag |= FSENTAKU;
  1864.     sentakuno++;
  1865.     return(1);
  1866. }
  1867.  
  1868. static int idset(PCELL far *tcu)    /* ID絞り込み */
  1869. {
  1870.     PCELL far *pt;
  1871.  
  1872.     tbl_set(tcu);
  1873.     if(!tcu->p->nifid[0]) {
  1874.         errdisp1(notiderror);
  1875.         return(0);
  1876.     }
  1877.     xhpread(MAXPOINT);
  1878.     memset(nifid,0,9);
  1879.     tbl_set(tcu);
  1880.     _fmemcpy((char far *)nifid,tcu->p->nifid,8);
  1881.     if(nifmode == NFCOMENT || nifmode == NFCOMENTID)
  1882.         comentclr();
  1883.     for(pt=p_head;pt->mode != NEND;pt=pt->next) {
  1884.         if(pt->count) {
  1885.             tbl_set(pt);
  1886.             pt->flag &= ~FDISP;
  1887.             if(!pt->p->nifid[0]) continue;
  1888.             if(_fmemcmp(pt->p->nifid,nifid,8)) continue;
  1889.             pt->flag |= FDISP;
  1890.         }
  1891.     }
  1892.     totalset(0);
  1893.     nifmode = NFID;
  1894.     pfset();
  1895.     return(1);
  1896. }
  1897.  
  1898. static int tagset(PCELL far *tcu)    /* タグ設定 */
  1899. {
  1900.     tbl_set(tcu);
  1901.     if(tcu->mode == NEND || (tcu->p->top == tcu->p->tail)) {
  1902.         errdisp1(tagseterror);
  1903.         return(0);
  1904.     }
  1905.     if(tcu->flag & FTAG) {
  1906.         tcu->flag &= ~FTAG;
  1907.         tagno--;
  1908.         return(1);
  1909.     }
  1910.     tcu->flag |= FTAG;
  1911.     tagno++;
  1912.     return(1);
  1913. }
  1914.  
  1915. static PCELL far *tagmae(PCELL far *tcu)    /* タグ前ジャンプ */
  1916. {
  1917.     PCELL far *pt;
  1918.  
  1919.     if(tagno) {
  1920.         for(pt = tcu->back;pt;pt=pt->back) {
  1921.             if(!pt->count) continue;
  1922.             if(pt->flag & FTAG) return(pt);
  1923.         }
  1924.     }
  1925.     errdisp1(tagnoterror);
  1926.     return((PCELL far *)0);
  1927. }
  1928.  
  1929. static PCELL far *tagato(PCELL far *tcu)    /* タグ次ジャンプ */
  1930. {
  1931.     PCELL far *pt;
  1932.  
  1933.     if(tagno) {
  1934.         for(pt = tcu->next;pt && pt->mode != NEND;pt=pt->next) {
  1935.             if(!pt->count) continue;
  1936.             if(pt->flag & FTAG) return(pt);
  1937.         }
  1938.     }
  1939.     errdisp1(tagnoterror);
  1940.     return((PCELL far *)0);
  1941. }
  1942.  
  1943. static PCELL far *shmae(PCELL far *tcu,int mode)    /* 前検索ジャンプ */
  1944. {
  1945.     PCELL far *pt;
  1946.     char buf[81],buf3[43];
  1947.  
  1948.     if(!shsub(buf3)) return((PCELL far *)0);
  1949.     bunbuffree();
  1950.     kprintf(srcmsg);
  1951.     for(pt = tcu->back;pt;pt=pt->back) {
  1952.         if(!pt->count) continue;
  1953.         tbl_set(pt);
  1954.         _fstrcpy((char far *)buf,pt->p->title);
  1955.         if(substrstr(buf,&buf3[2]))
  1956.             return(pt);
  1957.         if(!mode) {
  1958.             bunget(pt,1);
  1959.             if(subsearch(&buf3[2],0)) {
  1960.                 bunbuffree();
  1961.                 return(pt);
  1962.             }
  1963.             bunbuffree();
  1964.         }
  1965.     }
  1966.     sprintf(buf,"「%s」が見つかりません",&buf3[2]);
  1967.     errdisp1(buf);
  1968.     return((PCELL far *)0);
  1969. }
  1970.  
  1971. static PCELL far *shato(PCELL far *tcu,int mode)    /* 次検索ジャンプ */
  1972. {
  1973.     PCELL far *pt;
  1974.     char buf[81],buf3[43];
  1975.  
  1976.     xhpread(MAXPOINT);
  1977.     bunbuffree();
  1978.     if(!shsub(buf3)) return((PCELL far *)0);
  1979.     kprintf(srcmsg);
  1980.     for(pt = tcu->next;pt && pt->mode != NEND;pt=pt->next) {
  1981.         if(!pt->count) continue;
  1982.         tbl_set(pt);
  1983.         _fstrcpy((char far *)buf,pt->p->title);
  1984.         if(substrstr(buf,&buf3[2]))
  1985.             return(pt);
  1986.         if(!mode) {
  1987.             bunget(pt,1);
  1988.             if(subsearch(&buf3[2],0)) {
  1989.                 bunbuffree();
  1990.                 return(pt);
  1991.             }
  1992.             bunbuffree();
  1993.         }
  1994.     }
  1995.     sprintf(buf,"「%s」が見つかりません",&buf3[2]);
  1996.     errdisp1(buf);
  1997.     return((PCELL far *)0);
  1998. }
  1999.  
  2000. static void jumpmodechg(void)    /* ジャンプモード切替え処理 */
  2001. {
  2002.     if(++nextmode > 2) nextmode = 0;
  2003. }
  2004.  
  2005. static void title3disp(PCELL far *tcu)    /* タイトル画面の一画面分を求める */
  2006. {
  2007.     PCELL far *pt;
  2008.     int k;
  2009.  
  2010.     xhpread(tcu->count+line);
  2011.     ttop = p_head;
  2012.     ggtop = ttop;
  2013.     while(1) {
  2014.         for(k = 3,pt = ggtop;pt && k <= line-2;pt=pt->next) {
  2015.             if(!pt->count) continue;
  2016.             k++;
  2017.         }
  2018.         if(pt) ggtail = pt->back;
  2019.         else   ggtail = p_tail;
  2020.         if(ggtop->count <= tcu->count && ggtail->count >= tcu->count)
  2021.             return;
  2022.         for(ggtop = ggtail->next;!ggtop->count;ggtop=ggtop->next);
  2023.     }
  2024. }
  2025.  
  2026. char cnvpfkey(int a)        /* キー変換 */
  2027. {
  2028.     if(keytbl[a])
  2029.         return(keytbl[a]);
  2030.     return((char)0);
  2031. }
  2032.  
  2033. static PCELL far *uptcu0(PCELL far *tcu)    /* タイトル一つ次へ */
  2034. {
  2035.     xhpread(tcu->count+line);
  2036.     if(tcu->mode != NEND) {
  2037.         for(tcu=tcu->next;tcu->mode != NEND;tcu=tcu->next) {
  2038.             if(tcu->count)
  2039.                  break;
  2040.             xhpread(tcu->count+line);
  2041.         }
  2042.     }
  2043.     return(tcu);
  2044. }
  2045.  
  2046. static PCELL far *uptcu(PCELL far *tcu)    /* タイトル一つ次へ */
  2047. {
  2048.     if(tcu->mode != NEND) {
  2049.         for(tcu=tcu->next;tcu && tcu->mode != NEND;tcu=tcu->next) {
  2050.             if(tcu->count)
  2051.                  break;
  2052.         }
  2053.         if(!tcu) return(p_tail);
  2054.     }
  2055.     return(tcu);
  2056. }
  2057.  
  2058. static PCELL far *downtcu(PCELL far *tcu)    /* タイトル一つ前へ */
  2059. {
  2060.     if(tcu->count != 1) {
  2061.         for(tcu=tcu->back;tcu->count != 1;tcu=tcu->back) {
  2062.              if(tcu->count)
  2063.                  break;
  2064.         }
  2065.     }
  2066.     return(tcu);
  2067. }
  2068.  
  2069. static PCELL far *muptcu(PCELL far *tcu,int count)    /* タイトル複数次へ */
  2070. {
  2071.     for(;count;count--)
  2072.         tcu = uptcu(tcu);
  2073.     return(tcu);
  2074. }
  2075.  
  2076. static PCELL far *mdowntcu(PCELL far *tcu,int count) /* タイトル複数前へ */
  2077. {
  2078.     for(;count;count--)
  2079.         tcu = downtcu(tcu);
  2080.     return(tcu);
  2081. }
  2082.  
  2083. static PCELL far *nextjump(PCELL far *tcu,int count) /* ジャンプ処理 */
  2084. {
  2085.     PCELL far *pt;
  2086.  
  2087.     xhpread(tcu->count+count+line);
  2088.     pt = muptcu(tcu,count);
  2089.     if(pt->mode == NEND) return(downtcu(pt));
  2090.     return(pt);
  2091. }
  2092.  
  2093. static int kidokuset(PCELL far *tcu)    /* 既読セット処理 */
  2094. {
  2095.     PCELL far *pt;
  2096.  
  2097.     if(!yesnocheck("ここまでを既読としますか")) return(0);
  2098.     for(pt = tcu;pt;pt = pt->back) {
  2099.         if(!pt->count) continue;
  2100.         if(pt->mode < NHPHEAD)
  2101.             pt->flag |= FYOMI;
  2102.     }
  2103.     return(1);
  2104. }
  2105.  
  2106. static int kidokucancel(PCELL far *tcu)    /* 既読キャンセル処理 */
  2107. {
  2108.     PCELL far *pt;
  2109.  
  2110.     if(!yesnocheck("以降の既読を取消しますか")) return(0);
  2111.     for(pt = tcu;pt && pt->mode != NEND;pt = pt->next) {
  2112.         if(!pt->count) continue;
  2113.         if(pt->mode < NHPHEAD)
  2114.             pt->flag &= ~FYOMI;
  2115.     }
  2116.     return(1);
  2117. }
  2118.  
  2119. static void bundispsub(int po)    /* 内容一行表示 */
  2120. {
  2121.     char buf[81];
  2122.  
  2123.     if(!fbuf1[po]) iro(INAIYOU);
  2124.     else           iro(IKENSAKU);
  2125.     bunmode = 1;
  2126.     clr2();
  2127.     _fstrcpy((char far *)buf,buf1[po]);
  2128.     print(buf);
  2129.     bunmode = 0;
  2130. }
  2131.  
  2132. static PCELL far *autodisp(PCELL far *tcu)    /* 自動表示 */
  2133. {
  2134.     PCELL far *pt;
  2135.     int gtop,gtail,btail,k,rcode,savetime;
  2136.     char a,buf[81],savenifmode;
  2137.     int dispflag = 0;
  2138.  
  2139.     if(tcu->mode == NEND)
  2140.         return((PCELL far *)0);
  2141.     xhpread(MAXPOINT);
  2142.     savenifmode = nifmode;
  2143.     for(k=0;k < MAXLINE;k++) fbuf1[k]=0;
  2144.     for(pt=tcu;pt->mode != NEND;pt=pt->next) {
  2145.         if(!pt->count) continue;
  2146.         if(pt->flag & FSAKUJYO) continue;
  2147.         if(pt->mode == NSEPA) continue;
  2148.         if(nextmode && pt->mode >= NHPHEAD) continue;
  2149.         if(nextmode > 1 && (pt->flag & FYOMI)) continue;
  2150.         if(!(k = bunget(pt,1))) continue;
  2151.         savetime = 0;
  2152.          gtop = 1; btail = k-1;
  2153.         dispflag = 0;
  2154.         for(rcode=0;rcode != 2;) {
  2155.             pfset();
  2156.             pfdisp(4);
  2157.             for(k = 0;k < line-4;k++) {
  2158.                 if(gtop+k > btail)    break;
  2159.                 loc(1,k+3);
  2160.                 bundispsub(gtop+k-1);
  2161.             }
  2162.             gtail = gtop+k-1;
  2163.             if(!savetime || !pagemode || pagemode == 3)
  2164.                 autodisptime = autodisptime2 * k;
  2165.             else if(pagemode == 1)
  2166.                 autodisptime = autodisptime2 * ((k+1)/2);
  2167.             else
  2168.                 autodisptime = autodisptime2;
  2169.             autodisptime = (autodisptime+9)/10;
  2170.             savetime = 1;
  2171.             for(;k < line-4;k++) {
  2172.                 loc(1,k+3);clr1(INAIYOU);
  2173.             }
  2174.             for(rcode=0;!rcode;) {
  2175.                 if(gtail >= btail) {
  2176.                     if(tagmode && pt->mode < NHPHEAD)
  2177.                         pt->flag |= FYOMI;
  2178.                 }
  2179.                 nifmode=NFAUTO1;
  2180.                 if(gtop != 1) {
  2181.                     nstatus(1,pt,pt->count,p_tail->count,gtail,btail);
  2182.                     if(pt->mode < NHPHEAD && !dispflag) {
  2183.                         loc(1,2);
  2184.                         memset(buf,0,81);
  2185.                         _fstrcpy((char far *)buf,buf1[0]);
  2186.                         rtncut(buf);
  2187.                         strncat80(buf,space);
  2188.                         switch(pt->flag & ~(FTAG+FYOMI+FCYCLE)) {
  2189.                         case FSENTAKU: iro(IRSENTAKU); break;
  2190.                         case FSAKUJYO: iro(IRSAKUJYO); break;
  2191.                         case FSENTAKU+FSAKUJYO: iro(IRGATTAI); break;
  2192.                         default:       if(pt->flag & FYOMI) iro(IRYOMI);
  2193.                                        else iro(IMODE);
  2194.                                        break;
  2195.                         }
  2196.                         bunmode = 1;
  2197.                         print(buf);
  2198.                         bunmode = 0;
  2199.                         deforutoiro();
  2200.                         dispflag = 1;
  2201.                     }
  2202.                 }
  2203.                 else {
  2204.                     savepno = -1;
  2205.                     nstatus(1,pt,pt->count,p_tail->count,gtail,btail);
  2206.                     dispflag = 0;
  2207.                 }
  2208.                 time(lsavetime);
  2209.                 a = keyget2(2);
  2210.                 switch(a) {
  2211.                 case 0x1b:            /* ESCキー */
  2212.                 case 0x0d:            /* 改行キー */
  2213.                     bunbuffree();
  2214.                     goto autodisp_end;
  2215.                 case 0x20:            /* 空白キー */
  2216.                     nifmode=NFAUTO2;
  2217.                     nstatus(1,pt,pt->count,p_tail->count,gtail,btail);
  2218.                     for(rcode=0;!rcode;) {
  2219.                         a = keyget2(1);
  2220.                         switch(a) {
  2221.                         case 0x1b:    /* ESCキー */
  2222.                         case 0x0d:    /* 改行キー */
  2223.                             bunbuffree();
  2224.                             goto autodisp_end;
  2225.                         case 0x20:    /* 空白キー */
  2226.                             rcode=1;
  2227.                             break;
  2228.                         }
  2229.                     }
  2230.                 case 0:            /* タイムアウト処理 */
  2231.                     if(gtail >= btail) {
  2232.                         autodisptime = autodisptime2*5;
  2233.                         autodisptime = (autodisptime+9)/10;
  2234.                         savetime = 1;
  2235.                         time(lsavetime);
  2236.                         for(;keyget2(2);)
  2237.                             ;
  2238.                         if(tagmode && pt->mode < NHPHEAD)
  2239.                             pt->flag |= FYOMI;
  2240.                         rcode = 2;
  2241.                         break;
  2242.                     }
  2243.                     if(pagemode <= 1 || pagemode == 3) {
  2244.                         if(pagemode != 1) gtop += line-4;
  2245.                         else              gtop += (line-4)/2;
  2246.                         if(gtop > btail) gtop = btail;
  2247.                     }
  2248.                     else {
  2249.                         gtop++;
  2250.                         if(gtail < btail) gtail++;
  2251.                         sclup();
  2252.                         if(gtop+line-5 <= btail) {
  2253.                             loc(1,line-2);
  2254.                             bundispsub(gtop+line-6);
  2255.                         }
  2256.                     }
  2257.                     rcode = 1;
  2258.                     break;
  2259.                 }
  2260.             }
  2261.         }
  2262.         bunbuffree();
  2263.     }
  2264. autodisp_end:
  2265.     nifmode = savenifmode;
  2266.     return(pt);
  2267. }
  2268.  
  2269. static int bundisp(PCELL far *tcu)    /* 内容表示 */
  2270. {
  2271.     char a,buf[81];
  2272.     int k,rcode,btop,btail,gtop,gtail;
  2273.     PCELL far *pt;
  2274.     int dispflag=0;
  2275.  
  2276.     tmode = 0;
  2277.     for(k=0;k < MAXLINE;k++) fbuf1[k]=0;
  2278.     if(!(k = bunget(tcu,1))) return(0);
  2279.     gtop = btop = 1; btail = k-1;
  2280. /*    if(mode) {
  2281.         gtop = btail - (line-5);
  2282.         if(gtop < 1) {
  2283.             gtop = 1;
  2284.         }
  2285.     } */
  2286.     while(1) {
  2287. display:
  2288.         pfset();
  2289.         savepno = -1;
  2290.         dispflag = 0;
  2291. display1:
  2292.         topdisp();
  2293.         pfdisp(0);
  2294.         for(k = 0;k < line-4;k++) {
  2295.             if(gtop+k > btail)    break;
  2296.             loc(1,k+3);
  2297.             bundispsub(gtop+k-1);
  2298.         }
  2299.         gtail = gtop+k-1;
  2300.         for(;k < line-4;k++) {
  2301.             loc(1,k+3);clr1(INAIYOU);
  2302.         }
  2303. keyread:
  2304.         if(gtail >= btail) {
  2305.             if(tagmode && tcu->mode < NHPHEAD) {
  2306.                 tcu->flag |= FYOMI;
  2307.                 dispflag = 0;
  2308.             }
  2309.         }
  2310.         if(gtop != btop) {
  2311.             nstatus(1,tcu,tcu->count,p_tail->count,gtail,btail);
  2312.             if(tcu->mode < NHPHEAD && !dispflag) {
  2313.                 loc(1,2);
  2314.                 memset(buf,0,81);
  2315.                 _fstrcpy((char far *)buf,buf1[0]);
  2316.                 rtncut(buf);
  2317.                 strncat80(buf,space);
  2318.                 switch(tcu->flag & ~(FTAG+FYOMI+FCYCLE)) {
  2319.                 case FSENTAKU: iro(IRSENTAKU); break;
  2320.                 case FSAKUJYO: iro(IRSAKUJYO); break;
  2321.                 case FSENTAKU+FSAKUJYO: iro(IRGATTAI); break;
  2322.                 default:       if(tcu->flag & FYOMI) iro(IRYOMI);
  2323.                                else iro(IMODE);
  2324.                                break;
  2325.                 }
  2326.                 bunmode = 1;
  2327.                 print(buf);
  2328.                 bunmode = 0;
  2329.                 deforutoiro();
  2330.                 dispflag = 1;
  2331.             }
  2332.         }
  2333.         else {
  2334.             savepno = -1;
  2335.             nstatus(1,tcu,tcu->count,p_tail->count,gtail,btail);
  2336.             dispflag = 0;
  2337.         }
  2338.         time(lsavetime);
  2339.         a = keyget2(1);
  2340.         a = cnvpfkey(a);
  2341.         switch(a) {
  2342.         case UEYA:        /* ↑キー処理 */
  2343.             if(gtop <= btop) {
  2344.                 goto keyread;
  2345.             }
  2346.             gtop--;
  2347.             if(gtop+line-5 < gtail)    gtail--;
  2348.             scldown();
  2349.             loc(1,3);
  2350.             bundispsub(gtop-1);
  2351.             goto keyread;
  2352.         case SITAYA:    /* ↓キー処理 */
  2353.             if(gtail >= btail) {
  2354.                 goto keyread;
  2355.             }
  2356.             gtop++;
  2357.             if(gtail < btail)       gtail++;
  2358.             sclup();
  2359.             if(gtop+line-5 <= btail) {
  2360.                 loc(1,line-2);
  2361.                 bundispsub(gtop+line-6);
  2362.             }
  2363.             goto keyread;
  2364.         case HIDARIYA:    /* ←キー処理 */
  2365.             if(gtop == btop) {
  2366.                 if(tcu == ttop && topendmode) {
  2367.                     errdisp1(toperror);
  2368.                     goto keyread;
  2369.                 }
  2370.                 rcode = -1;
  2371.                 break;
  2372.             }
  2373.             if(pagemode != 1) gtop -= line-4;
  2374.             else              gtop -= (line-4)/2;
  2375.             if(gtop < btop)    gtop = btop;
  2376.             goto display;
  2377.         case MIGIYA:    /* →キー処理 */
  2378.             if(gtail >= btail) {
  2379.                 if(uptcu(tcu) == ttail && topendmode) {
  2380.                     errdisp1(enderror);
  2381.                     goto keyread;
  2382.                 }
  2383.                 rcode = 1;
  2384.                 break;
  2385.             }
  2386.             if(pagemode != 1) gtop += line-4;
  2387.             else              gtop += (line-4)/2;
  2388.             if(gtop > btail) gtop = btail;
  2389.             goto display;
  2390.         case SENTAKU:    /* 選択キー処理 */
  2391.             sentaku(tcu);
  2392.             savepno = -1;
  2393.             dispflag = 0;
  2394.             goto keyread;
  2395.         case KAIGYO:    /* 終了処理 */
  2396.         case ESC:
  2397.         case PF1:
  2398.             rcode = 0;
  2399.             break;
  2400.         case PF2:        /* 先頭行表示処理 */
  2401.             if(gtop == btop) {
  2402.                 goto keyread;
  2403.             }
  2404.             gtop = btop;
  2405.             goto display;
  2406.         case PF3:        /* 最終行表示処理 */
  2407.             if(gtail >= btail) {
  2408.                 goto keyread;
  2409.             }
  2410.             gtop = btail-line+5;
  2411.             if(gtop < 1)    gtop = 1;
  2412.             goto display;
  2413.         case PF4:        /* ヘルプ処理 */
  2414.             help(1);
  2415.             goto display;
  2416.         case PF5:        /* 切り出し処理 */
  2417.             if(!kiridasi(tcu)) goto display1;
  2418.             bunget(tcu,1);
  2419.             goto display;
  2420.         case PF6:        /* 削除処理 */
  2421.             if(!sakujyo(tcu)) goto keyread;
  2422.             goto display;
  2423.         case PF7:        /* コピー処理 */
  2424.             if(!fukusya(tcu)) goto display1;
  2425.             bunget(tcu,1);
  2426.             goto display;
  2427.         case PF8:        /* 検索処理 */
  2428.             search(1);
  2429.             goto display;
  2430.         case PF9:        /* ID処理 */
  2431.             if(idset(tcu)) {
  2432.                 title3disp(tcu);
  2433.                 savepno = -1;
  2434.                 topdisp();
  2435.                 pfdisp(0);
  2436.             }
  2437.             goto display;
  2438.         case PF10:        /* コメント処理 */
  2439.             if(coment(tcu,0)) {
  2440.                 title3disp(tcu);
  2441.                 savepno = -1;
  2442.                 topdisp();
  2443.                 pfdisp(0);
  2444.             }
  2445.             goto display;
  2446.         case S_PF1:        /* DOS呼び出し処理 */
  2447.             k = oscall();
  2448.             if(k == -1) {
  2449.                 rcode = -4; break;
  2450.             }
  2451.             if(k == -2) {
  2452.                 rcode = -5; break;
  2453.             }
  2454.             goto display;
  2455.         case S_PF2:        /* 前項処理 */
  2456.             rcode = -1; break;
  2457.         case S_PF3:        /* 次項処理 */
  2458.             rcode = 1; break;
  2459.         case S_PF5:        /* 選択取り消し処理 */
  2460.             if(!torikesi())
  2461.                 goto keyread;
  2462.             savepno = -1;
  2463.             dispflag = 0;
  2464.             goto keyread;
  2465.         case S_PF6:        /* 削除取り消し処理 */
  2466.             if(!sakutorikesi())
  2467.                 goto keyread;
  2468.             savepno = -1;
  2469.             dispflag = 0;
  2470.             goto keyread;
  2471.         case S_PF7:        /* タグセット処理 */
  2472.             if(!tagset(tcu))
  2473.                 goto keyread;
  2474.             savepno = -1;
  2475.             dispflag = 0;
  2476.             goto keyread;
  2477.         case S_PF8:        /* タグ前ジャンプ処理 */
  2478.             if(!(pt=tagmae(tcu)))
  2479.                 goto keyread;
  2480.             pt->flag |= FJUMP;
  2481.             rcode = -2; break;
  2482.         case S_PF9:        /* タグ後ろジャンプ処理 */
  2483.             if(!(pt=tagato(tcu)))
  2484.                 goto keyread;
  2485.             pt->flag |= FJUMP;
  2486.             rcode = 2; break;
  2487.         case S_PF10:    /* 発言処理 */
  2488.             if(!hatugen(tcu,0)) goto display1;
  2489.             goto display;
  2490.         case C_PF2:        /* タイトル出力処理 */
  2491.             titleout();
  2492.             goto display;
  2493.         case C_PF3:        /* 前検索ジャンプ処理 */
  2494.             if(!(pt=shmae(tcu,0))) {
  2495.                 bunget(tcu,1);
  2496.                 goto display;
  2497.             }
  2498.             pt->flag |= FJUMP;
  2499.             rcode = -2; break;
  2500.         case C_PF4:        /* 後ろ検索ジャンプ処理 */
  2501.             if(!(pt=shato(tcu,0))) {
  2502.                 bunget(tcu,1);
  2503.                 goto display;
  2504.             }
  2505.             pt->flag |= FJUMP;
  2506.             rcode = 2; break;
  2507.         case C_PF5:        /* 印刷 */
  2508.             if(!printsub(tcu)) goto display1;
  2509.             bunget(tcu,1);
  2510.             goto display;
  2511.         case C_PF8:        /* 行数切り換え処理 */
  2512.             chgline(tcu);
  2513.             goto display;
  2514.         case C_PF9:        /* 利用者コマンド処理 */
  2515.             k=usertouroku(tcu,gtop);
  2516.             if(k == 1) {
  2517.                 bunget(tcu,1);
  2518.             }
  2519.             if(k == -1) {
  2520.                 rcode = -4; break;
  2521.             }
  2522.             if(k == -2) {
  2523.                 rcode = -5; break;
  2524.             }
  2525.             goto display;
  2526.         case C_PF10:    /* 自動表示処理 */
  2527.             bunbuffree();
  2528.             pt = autodisp(tcu);
  2529.             if(pt == tcu) {
  2530.                 bunget(tcu,1);
  2531.                 goto display;
  2532.             }
  2533.             pt->flag |= FJUMP;
  2534.             rcode = 2; break;
  2535.         case SC_PF2:    /* ジャンプ10処理 */
  2536.             if((pt=nextjump(tcu,9)) == tcu)
  2537.                 goto keyread;
  2538.             pt->flag |= FJUMP;
  2539.             rcode = 2; break;
  2540.         case SC_PF3:    /* ジャンプ20処理 */
  2541.             if((pt=nextjump(tcu,19)) == tcu)
  2542.                 goto keyread;
  2543.             pt->flag |= FJUMP;
  2544.             rcode = 2; break;
  2545.         case SC_PF4:    /* ジャンプ50処理 */
  2546.             if((pt=nextjump(tcu,49)) == tcu)
  2547.                 goto keyread;
  2548.             pt->flag |= FJUMP;
  2549.             rcode = 2; break;
  2550.         case SC_PF5:    /* 既読セット処理 */
  2551.             if(!kidokuset(tcu))
  2552.                 goto keyread;
  2553.             goto display;
  2554.         case SC_PF6:    /* 既読キャンセル処理 */
  2555.             if(!kidokucancel(tcu))
  2556.                 goto keyread;
  2557.             goto display;
  2558.         case SC_PF7:        /* ジャンプモード切替え処理 */
  2559.             jumpmodechg();
  2560.             goto keyread;
  2561.         case SC_PF9:        /* コメント+ID処理 */
  2562.             if(comentid(tcu)) {
  2563.                 title3disp(tcu);
  2564.                 savepno = -1;
  2565.                 topdisp();
  2566.                 pfdisp(0);
  2567.             }
  2568.             goto display;
  2569.         case SC_PF10:    /* 発言2処理 */
  2570.             if(!hatugen(tcu,1)) goto display1;
  2571.             goto display;
  2572.         default:        /* 無効キー処理 */
  2573.             errdisp1(keyerror);
  2574.             goto keyread;
  2575.         }
  2576.         break;
  2577.     }
  2578.     bunbuffree();
  2579.     return(rcode);
  2580. }
  2581.  
  2582. static long wait2time(void)        /* ウェイト処理1 */
  2583. {
  2584.     long j=0;
  2585.  
  2586.     j += 1 * 123;
  2587.     return(j);
  2588. }
  2589.  
  2590. static long timework;
  2591. static void waittime(int time)    /* ウェイト処理2 */
  2592. {
  2593.     int i;
  2594.  
  2595.     for(i = 0; i < time; i++)
  2596.         timework = wait2time();
  2597. }
  2598.  
  2599. static void typedisp(PCELL far *tcu)    /* TYPE */
  2600. {
  2601.     int a;
  2602.     long nl;
  2603.  
  2604.     allclr();
  2605.     restorecon(1);
  2606.     setline(0);
  2607.     tbl_set(tcu);
  2608.     xxfseek(tcu,tcu->p->top);
  2609.     nl = tcu->p->tail;
  2610.     while(xftell() < nl || !nl) {
  2611.         if((a = xfgetc()) < 0)    break;
  2612.          putchar(a);
  2613.         if(kbhit()) {
  2614.             if(getch() == 0x1b) {
  2615.                 printf("\n");
  2616.                 break;
  2617.             }
  2618.         }
  2619.         waittime(typespeed*typespeed);
  2620.     }
  2621.     locate(1,line-1);clr();
  2622.     kprintf(etckeymsg);
  2623.     keyget();
  2624.     allclr();
  2625.     setcon(1);
  2626.     setline(line);
  2627. }
  2628.  
  2629. static int logproc=0;    /* ログ整理済フラグ */
  2630. static void logedit(int mode)    /* ログ整理処理 */
  2631. {
  2632.     PCELL far *pt;
  2633.     int i;
  2634.     char buf[81];
  2635.  
  2636.     xhpread(MAXPOINT);
  2637.     if(logproc) {         /* ログ整理済? */
  2638.         if(logproc == 1) {
  2639.             if(!yesnocheck("ログ整理(大分類)済です。続行しますか")) return;
  2640.         }
  2641.         else {
  2642.             if(!yesnocheck("ログ整理(詳細分類)済です。続行しますか")) return;
  2643.         }
  2644.     }
  2645.     if(!mode) {
  2646.         if(!yesnocheck("ログ整理(大分類)を行いますか")) return;
  2647.     }
  2648.     else {
  2649.         if(!yesnocheck("ログ整理(詳細分類)を行いますか")) return;
  2650.     }
  2651.     if(tagmode == 2) {
  2652.         for(pt=p_tail,i=0;pt;pt=pt->back) {
  2653.             if(pt->mode < NHPHEAD) {
  2654.                 if(pt->flag & FYOMI) i = 1;
  2655.                 else {
  2656.                     if(i) pt->flag |= FYOMI;
  2657.                 }
  2658.             }
  2659.         }
  2660.     }
  2661.     memset(logforum,0,9);
  2662.     memset(loghpid,0,9);
  2663.     memset(logmes,0,3);
  2664.     memset(loglib,0,3);
  2665.     memset(logniftyid,0,9);
  2666.     dateget();
  2667.     if(!mode) {
  2668.         grh_dispx("ログ整理(大分類)処理中",1);
  2669.     }
  2670.     else {
  2671.         grh_dispx("ログ整理(詳細分類)処理中",1);
  2672.     }
  2673.     for(pt=p_top,i=1; pt->mode != NEND;pt=pt->next) {
  2674.         if(!pt->count) continue;
  2675.         if(pt->flag & FSAKUJYO) continue;
  2676. /*        xlocate();
  2677.         sprintf(buf,"只今、%d/%dタイトル目を処理中です。",i,p_tail->count-sakujyono-1);
  2678.         kprintf(buf); */
  2679.         if(logedit1(pt,0,mode));
  2680.         if(keycheck() && getch() == 0x1b) break;
  2681.         grh_sub(i++,p_tail->count-sakujyono-1);
  2682.     }
  2683.     grh_sub(1,1);
  2684.     logproc = mode+1;
  2685.     logclose(1);
  2686. }
  2687.  
  2688. static void logeditx(char mode)    /* ログ整理処理(バッチ処理用) */
  2689. {
  2690.     PCELL far *pt;
  2691.     int i;
  2692.     char *s;
  2693.  
  2694.     if(!mode) s = "大";
  2695.     else      s = "詳細";
  2696.     printf("%sファイルのログ整理(%s分類)出力中です(ESCキーで中断)。\n",gfilename,s);
  2697.     memset(logforum,0,9);
  2698.     memset(loghpid,0,9);
  2699.     memset(logmes,0,3);
  2700.     memset(loglib,0,3);
  2701.     memset(logniftyid,0,9);
  2702.     dateget();
  2703.     for(pt=p_top,i=1; pt->mode != NEND;pt=pt->next,i++) {
  2704.         if(logedit1(pt,1,(int)mode));
  2705.         if(keycheck() && getch() == 0x1b) break;
  2706.     }
  2707.     logclose(1);
  2708. }
  2709.  
  2710. static int endcheck(void)    /* 終了処理 */
  2711. {
  2712.     char filename1[129],filename2[129];
  2713.     PCELL far *pt;
  2714.     PCELL far *pw;
  2715.     char *a,buf[81];
  2716.     FILE *fd1;
  2717.     int j,x,endf=1,sno;
  2718.     long nl,top,tail,lno,w,w2;
  2719.     char cmd[256],dir[231];
  2720.  
  2721.     if(nifmode != NFNORMAL)
  2722.         comentclr();
  2723.     if(tagmode == 2) {
  2724.         for(pt=p_tail,j=0;pt;pt=pt->back) {
  2725.             if(pt->mode < NHPHEAD) {
  2726.                 if(pt->flag & FYOMI) j = 1;
  2727.                 else {
  2728.                     if(j) pt->flag |= FYOMI;
  2729.                 }
  2730.             }
  2731.         }
  2732.     }
  2733.     if(!(foutmode & F_MEMERR) && (sakujyono || foutmode)) {
  2734.         if(!sakujyomode) {
  2735.             sprintf(buf,"元のログファイルを修正してもいいですか");
  2736.             if(!yesnocheck(buf)) goto endck_rtn;
  2737.         }
  2738.         xhpread(MAXPOINT);
  2739.         if(startmode >= 8) fno = 1;
  2740.          sno = sakujyono;
  2741.         for(;fno <= maxfno;) {
  2742.             endf = 1;
  2743.             midokuno = 0;
  2744.             if(maxfno > 1)
  2745.                 _fstrcpy((char far *)filename,file[fno-1]);
  2746.             if(!(midokumode & 2) && (tagmode >= 3))
  2747.                 if(nifoutopen()) goto endck_rtn;
  2748.             strcpy(filename1,filename);
  2749.             if(!(a = jstrrchr(filename1,'.'))) {
  2750.                 strcpy(filename2,filename);
  2751.             }
  2752.             else {
  2753.                 *a = 0;
  2754.                 strcpy(filename2,filename1);
  2755.             }
  2756.             strcat(filename1,".$$$");
  2757.             strcat(filename2,".");
  2758.             strcat(filename2,savsafix);
  2759.             remove(filename1);
  2760.             if(!(fd1 = xxfopen(filename1,"at"))) {
  2761. endck_rtn0:
  2762.                 if(!(midokumode & 2) && (tagmode >= 3))
  2763.                     nifoutclose(1);
  2764.                 goto endck_rtn;
  2765.             }
  2766.             grh_dispx("ログファイル修正中",0);
  2767.             xlocate();
  2768.             for(pt=p_top,j=0,x=p_tail->count-sno,lno=w=1;pt;pt=pt->next) {
  2769.                 tbl_set(pt);
  2770.                 if(pt->flag & FSAKUJYO) {
  2771.                     if(w) lno += pt->p->lineno - w;
  2772.                     w = 0;
  2773.                     pt->flag &= ~FSAKUJYO;
  2774.                     sno--;
  2775.                     continue;
  2776.                 }
  2777.                 if(!(midokumode & 2) && (tagmode >= 3)) {
  2778.                     if(pt->mode != NSEPA) {
  2779.                         w2 = pt->p->lineno;
  2780.                         if(w) lno += w2 - w;
  2781.                         w = w2;
  2782.                         pt->p->lineno = lno;
  2783.                         top = pt->p->top;
  2784.                         tail = pt->p->tail;
  2785.                         pt->p->top = ftell(fd1);
  2786.                         pt->p->tail = tail - top + pt->p->top;
  2787.                         if(nifoutput(pt)) {
  2788.                             nifoutclose(1);
  2789.                             goto endck_rtn;
  2790.                         }
  2791.                         tbl_set(pt);
  2792.                         pt->p->top = top;
  2793.                         pt->p->tail = tail;
  2794.                     }
  2795.                 }
  2796.                 xlocate();
  2797.                 if(pt->mode == NEND) break;
  2798. /*                sprintf(buf,"只今、%d/%dタイトル目を出力中です。",++j,x-1);
  2799.                 kprintf(buf); */
  2800.                 if(!(j++ % 10)) grh_sub(j,x-1);
  2801.                 if(pt->p->top == pt->p->tail) {
  2802. /*                    if(pt->mode == NSEPA) continue;
  2803.                     _fstrcpy((char far *)buf,pt->p->title);
  2804.                     strcat(buf,"\n");
  2805.                     if(fputsub(buf,fd1,filename1)) {
  2806.                         remove(filename1);
  2807.                         goto endck_rtn0;
  2808.                     } */
  2809.                     continue;
  2810.                 }
  2811.                 else {
  2812.                     xxfseek(pt,pt->p->top);
  2813.                     nl = pt->p->tail;
  2814.                     if(xftell() == nl) continue;
  2815.                     while(xftell() < nl || !nl) {
  2816.                         if(!xfgets(buf,81))    break;
  2817.                         if(fputsub(buf,fd1,filename1)) {
  2818.                             remove(filename1);
  2819.                             goto endck_rtn0;
  2820.                         }
  2821.                     }
  2822.                 }
  2823.                 if(pt->mode < NHPHEAD) {
  2824.                     if(endf && pt->flag & FYOMI)
  2825.                         midokuno++;
  2826.                     else
  2827.                         endf = 0;
  2828.                 }
  2829.             }
  2830.             grh_sub(1,1);
  2831.             if(!(midokumode & 2) && (tagmode >= 3))
  2832.                 nifoutclose(1);
  2833.             if(endf) midokuno = 0 - midokuno;
  2834.             fclose(fd1);
  2835.             xfclose();
  2836.             if(!editmode) {
  2837.                 if(!*bakdir) {
  2838.                     remove(filename2);
  2839.                     rename(filename,filename2);
  2840.                     rename(filename1,filename);
  2841.                 }
  2842.                 else {
  2843.                     strcpy(dir,bakdir);
  2844.                     if(!(a = jstrrchr(filename,'\\'))
  2845.                      && !(a = jstrrchr(filename,':')))
  2846.                         a = filename;
  2847.                     else a++;
  2848.                     strncat(dir,a,230);
  2849.                     sprintf(cmd, "COPY %s %s > NUL", filename, dir);
  2850.                     system(cmd);
  2851.                     ems_lno = -1;
  2852. /*                    remove(filename);
  2853.                     rename(filename1,filename); */
  2854.                     sprintf(cmd, "COPY %s %s > NUL", filename1, filename);
  2855.                     system(cmd);
  2856.                     remove(filename1);
  2857.                 }
  2858.             }
  2859.             else {
  2860.                 remove(filename);
  2861.                 rename(filename1,filename);
  2862.             }
  2863.             if(startmode < 8) break;
  2864.             fno++;
  2865.         }
  2866.         return(1);
  2867.     }
  2868. endck_rtn:
  2869.     midokuno = 0;
  2870.     switch(tagmode) {
  2871.     case 0: break;
  2872.     case 1:
  2873.     case 2:
  2874.         for(pt = p_top;pt; pt = pt->next) {
  2875.             if(pt->mode >= NHPHEAD) continue;
  2876.             if(!(pt->flag & FYOMI)) {
  2877.                 endf = 0;
  2878.                 break;
  2879.             }
  2880.             midokuno++;
  2881.         }
  2882.         if(endf) midokuno = 0 - midokuno;
  2883.         break;
  2884.     default:
  2885.         if((midokumode & 2)) break;
  2886.         xhpread(MAXPOINT);
  2887.         if(nifoutopen()) break;
  2888.         for(pt = p_top; pt; pt = pt->next) {
  2889.             if(pt->mode == NSEPA) continue;
  2890.             if(nifoutput(pt)) break;
  2891.         }
  2892.         nifoutclose(1);
  2893.     }
  2894.     return(0);
  2895. }
  2896.  
  2897. static void title1disp(PCELL far *tcu,int mode)    /* タイトルリバース表示 */
  2898. {
  2899.     char buf[81],mode1;
  2900.  
  2901.     loc(1,tcu->count - ggtop->count+3);
  2902.     memset(buf,0,81);
  2903.     sprintf(buf," ");
  2904.     tbl_set(tcu);
  2905.     _fstrcpy((char far *)&buf[1],tcu->p->title);
  2906.     if(mode) {
  2907.         switch(mode1 = tcu->mode) {
  2908.         case NEND:    iro(IREND); break;
  2909.         case NSEPA:    if(tcu->p->top == tcu->p->tail) {
  2910.                         iro(IRSEPA); break;
  2911.                     }
  2912.         default:    switch(tcu->flag & ~(FTAG+FYOMI+FCYCLE)) {
  2913.                     case FSENTAKU: iro(IRSENTAKU);
  2914.                                    buf[0] = '+';
  2915.                                    break;
  2916.                     case FSAKUJYO: iro(IRSAKUJYO);
  2917.                                    buf[0] = 'd';
  2918.                                    break;
  2919.                     case FSENTAKU+FSAKUJYO: iro(IRGATTAI);
  2920.                                    buf[0] = '*';
  2921.                                    break;
  2922.                     default: if(tcu->flag & FTAG) iro(IRTAG);
  2923.                              else if(tcu->flag & FYOMI) {
  2924.                                      iro(IRYOMI);
  2925.                                     buf[0] = '-';
  2926.                              }
  2927.                                 else if(mode1 >= NHPHEAD) iro(IRHEAD);
  2928.                              else iro(IRETC);
  2929.                              break;
  2930.                    }
  2931.         }
  2932.     }
  2933.     else {
  2934.         switch(mode1 = tcu->mode) {
  2935.         case NEND:    iro(IEND); break;
  2936.         case NSEPA:    if(tcu->p->top == tcu->p->tail) {
  2937.                         iro(ISEPA); break;
  2938.                     }
  2939.         default:    switch(tcu->flag & ~(FTAG+FYOMI+FCYCLE)) {
  2940.                     case FSENTAKU: iro(ISENTAKU);
  2941.                                    buf[0] = '+';
  2942.                                    break;
  2943.                     case FSAKUJYO: iro(ISAKUJYO);
  2944.                                    buf[0] = 'd';
  2945.                                    break;
  2946.                     case FSENTAKU+FSAKUJYO: iro(IGATTAI);
  2947.                                    buf[0] = '*';
  2948.                                    break;
  2949.                     default: if(tcu->flag & FTAG) iro(ITAG);
  2950.                              else if(tcu->flag & FYOMI) {
  2951.                                      iro(IYOMI);
  2952.                                     buf[0] = '-';
  2953.                              }
  2954.                              else if(mode1 >= NHPHEAD) iro(IHEAD);
  2955.                              else iro(IETC);
  2956.                              break;
  2957.                    }
  2958.         }
  2959.     }
  2960.     strncat80(buf,space);
  2961.     print(buf);
  2962.     deforutoiro();
  2963. }
  2964.  
  2965. static void title2disp(PCELL far *po)    /* タイトル一行表示 */
  2966. {
  2967.     char buf[81],mode;
  2968.  
  2969.     memset(buf,0,81);
  2970.     sprintf(buf," ");
  2971.     tbl_set(po);
  2972.     _fstrcpy((char far *)&buf[1],po->p->title);
  2973.     switch(mode = po->mode) {
  2974.     case NEND:    iro(IEND); break;
  2975.     case NSEPA:    if(po->p->top == po->p->tail) {
  2976.                     iro(ISEPA); break;
  2977.                 }
  2978.     default:   switch(po->flag & ~(FTAG+FYOMI+FCYCLE)) {
  2979.                case FSENTAKU: iro(ISENTAKU);
  2980.                               buf[0] = '+';
  2981.                               break;
  2982.                case FSAKUJYO: iro(ISAKUJYO);
  2983.                               buf[0] = 'd';
  2984.                               break;
  2985.                case FSENTAKU+FSAKUJYO: iro(IGATTAI);
  2986.                               buf[0] = '*';
  2987.                               break;
  2988.                default: if(po->flag & FTAG)
  2989.                             iro(ITAG);
  2990.                         else if(po->flag & FYOMI) {
  2991.                             iro(IYOMI);
  2992.                             buf[0] = '-';
  2993.                         }
  2994.                            else if(mode >= NHPHEAD)
  2995.                             iro(IHEAD);
  2996.                         else iro(IETC);
  2997.                         break;
  2998.               }
  2999.     }
  3000.     strncat80(buf,space);
  3001.     print(buf);
  3002.     deforutoiro();
  3003. }
  3004.  
  3005. static void getgtail(PCELL far *tcu)    /* 最終タイトル行を求める */
  3006. {
  3007.     PCELL far *pt;
  3008.     int k;
  3009.  
  3010.     while(1) {
  3011.         for(k = 3,pt = ggtop;pt && k <= line-2;pt=pt->next) {
  3012.             if(!pt->count) continue;
  3013.             k++;
  3014.         }
  3015.         if(pt) ggtail = pt->back;
  3016.         else   ggtail = p_tail;
  3017.         if(ggtop->count <= tcu->count && ggtail->count >= tcu->count)
  3018.             return;
  3019.         for(ggtop = ggtail->next;!ggtop->count;ggtop=ggtop->next);
  3020.     }
  3021. }
  3022.  
  3023. static void tstatus(PCELL far *tcu)    /* タイトル状態表示 */
  3024. {
  3025.     int i,j,k;
  3026.  
  3027.     i = tcu->count;
  3028.     j = ttail->count;
  3029.     k = ggtail->count;
  3030.     tbl_set(tcu);
  3031.     kensakukensu = tcu->p->cmt;
  3032.     nstatus(0,tcu,i,j,k,0);
  3033. }
  3034.  
  3035. static int jumpck(PCELL far *tcu)    /* 次のタイトル位置チェック */
  3036. {
  3037.     if(tcu->mode == NSEPA) return(0);
  3038.     if(tcu->mode == NEND) return(1);
  3039.     tbl_set(tcu);
  3040.     if(tcu->p->top == tcu->p->tail) return(0);
  3041.     if(!nextmode) return(1);
  3042.     if(tcu->mode >= NHPHEAD) return(0);
  3043.     if(nextmode > 1 && (tcu->flag & FYOMI)) return(0);
  3044.     return(1);
  3045. }
  3046.  
  3047. static PCELL far *bfindfile(int n)    /* ファイル前サーチ */
  3048. {
  3049.     PCELL far *pt;
  3050.  
  3051.     for(pt = ttail->back;pt->count != 1;pt=pt->back) {
  3052.         if(!pt->count)
  3053.             continue;
  3054.         tbl_set(pt);
  3055.         if(pt->p->fno <= n)
  3056.             break;
  3057.     }
  3058.     return(pt);
  3059. }
  3060.  
  3061. static PCELL far *findfile(int n)    /* ファイル次サーチ */
  3062. {
  3063.     PCELL far *pt;
  3064.  
  3065.     xhpread(MAXPOINT);
  3066.     for(pt=p_top;pt->mode != NEND;pt=pt->next) {
  3067.         if(!pt->count)
  3068.             continue;
  3069.         tbl_set(pt);
  3070.         if(pt->p->fno >= n)
  3071.             break;
  3072.     }
  3073.     return(pt);
  3074. }
  3075.  
  3076. static int titledisp(long bigin)    /* タイトル表示 */
  3077. {
  3078.     char a,c;
  3079.     int i,rtn;
  3080.     PCELL far *tcu;
  3081.     PCELL far *w;
  3082.     char buf[129];
  3083.  
  3084.     tmode = 1;
  3085.     if(startmode >= 4 && startmode <= 7) coment(0,1);
  3086.     ttop = p_head;
  3087.     ttail = p_tail;
  3088.     switch(bigin) {
  3089.     case -2:
  3090.         if(pend != 2) w = ttop;
  3091.         else {
  3092.             for(w = ttail; w->back && w != ttop; w = w->back) {
  3093.                 if(w->mode >= NHPHEAD) continue;
  3094.                 if(!(w->flag & FYOMI)) continue;
  3095.                 break;
  3096.             }
  3097.             if(w != ttop && !(w->next->flag & FYOMI)) w = w->next;
  3098.         }
  3099.         break;
  3100.     case -1:
  3101.         if(pend != 2) w = ttop;
  3102.         else {
  3103.             for(w = ttop; w->next && w->mode != NEND; w = w->next) {
  3104.                 if(w->mode >= NHPHEAD) continue;
  3105.                 if(w->flag & FYOMI) continue;
  3106.                 break;
  3107.             }
  3108.         }
  3109.         break;
  3110.     case 0:
  3111.         w = ttop;
  3112.         break;
  3113.     default:
  3114.         for(w = ttop,i=0; w->mode != NEND; w = w->next) {
  3115.             if(w->mode >= NHPHEAD) continue;
  3116.             i++;
  3117.             if(i > bigin) break;
  3118.             w->flag |= FYOMI;
  3119.         }
  3120.     }
  3121.     ggtop = tcu = w;
  3122.     getgtail(tcu);
  3123.     while(1) {
  3124.         savepno = -1;        /* タイトル一画面表示 */
  3125.         topdisp();
  3126.         pfdisp(0);
  3127.         for(i = 3,w = ggtop;w && i <= line-2;w=w->next) {
  3128.             if(!w->count) continue;
  3129.             loc(1,i);
  3130.             title2disp(w);
  3131.             i++;
  3132.         }
  3133.         if(w) ggtail = w->back;
  3134.         else  ggtail = p_tail;
  3135.         for(;i <= line-2;i++) {
  3136.             loc(1,i);clr1(IETC);
  3137.         }
  3138. keyreadt:
  3139.         tstatus(tcu);
  3140.         title1disp(tcu,1);
  3141.         a = keyget2(1);        /* キー読み込み */
  3142.         a = cnvpfkey(a);
  3143.  
  3144.         switch(a) {
  3145.         case KAIGYO:        /* 改行キー処理 */
  3146. tdisp1_1:
  3147.             tstatus(tcu);
  3148.             rtn = bundisp(tcu);
  3149. tdisp1_2:
  3150.             tmode = 1;
  3151.             pfset();
  3152.             savepno = -1;
  3153.             if(!rtn) {
  3154.                 if(!returnmode) {
  3155.                     if(ggtail->count < tcu->count || ggtop->count > tcu->count)
  3156.                         ggtop = tcu;
  3157.                          continue;
  3158.                 }
  3159.                 w = downtcu(ttail);
  3160.                 if(tcu->count < w->count) {
  3161.                     for(;;) {
  3162.                        tcu = uptcu0(tcu);
  3163.                        tbl_set(tcu);
  3164.                        if(tcu->p->top != tcu->p->tail || tcu->mode == NEND)
  3165.                             break;
  3166.                     }
  3167.                 }
  3168.                 title3disp(tcu);
  3169.                  continue;
  3170.             }
  3171.             if(rtn == -1) {
  3172.                 if(tcu->count <= ttop->count) {
  3173.                     ggtop = tcu = ttop;
  3174.                      continue;
  3175.                 }
  3176.                 for(;tcu->count > ttop->count;) {
  3177.                     tcu = downtcu(tcu);
  3178.                     if(jumpck(tcu))
  3179.                         break;
  3180.                 }
  3181.                 goto tdisp1_1;
  3182. /*                if(rtn == -1) goto tdisp1_1;
  3183.                 tstatus(tcu);
  3184.                 rtn = bundisp(tcu,1);
  3185.                 goto tdisp1_2; */
  3186.             }
  3187.             if(rtn == -2) {
  3188.                 for(;tcu->count > ttop->count;) {
  3189.                     tcu = downtcu(tcu);
  3190.                     if(tcu->flag & FJUMP) {
  3191.                         tcu->flag &= ~FJUMP;
  3192.                         break;
  3193.                     }
  3194.                 }
  3195.                 goto tdisp1_1;
  3196.             }
  3197.             if(rtn == 1) {
  3198.                 w = downtcu(ttail);
  3199.                 if(tcu->count < w->count) {
  3200.                     for(;;) {
  3201.                         tcu = uptcu0(tcu);
  3202.                         if(jumpck(tcu)) break;
  3203.                     }
  3204.                     if(tcu->mode != NEND)
  3205.                         goto tdisp1_1;
  3206.                 }
  3207.                 title3disp(tcu);
  3208.                  continue;
  3209.             }
  3210.             if(rtn == 2) {
  3211.                 for(;;) {
  3212.                    tcu = uptcu0(tcu);
  3213.                     if(tcu->flag & FJUMP) {
  3214.                         tcu->flag &= ~FJUMP;
  3215.                         break;
  3216.                     }
  3217.                 }
  3218.                 goto tdisp1_1;
  3219.             }
  3220.             if(rtn <= -4) {
  3221.                 xfclose();
  3222.                 return(rtn);
  3223.             }
  3224.             break;
  3225.         case UEYA:        /* ↑キー処理 */
  3226.             title1disp(tcu,0);
  3227.             if(tcu->count > ggtop->count) {
  3228.                 tcu = downtcu(tcu);
  3229.                 break;
  3230.             }
  3231.             if(ggtop == ttop) break;
  3232.             ggtop = tcu = downtcu(ggtop);
  3233.             getgtail(tcu);
  3234.             scldown();
  3235.             loc(1,3);
  3236.             title2disp(ggtop);
  3237.             break;
  3238.         case SITAYA:    /* ↓キー処理 */
  3239. tsita:
  3240.             title1disp(tcu,0);
  3241.             if(tcu->count < ggtail->count) {
  3242.                 tcu = uptcu(tcu);
  3243.                 break;
  3244.             }
  3245.             if(ggtail == ttail)    break;
  3246.             xhpread(tcu->count+5);
  3247.             ggtop = uptcu(ggtop);
  3248.             tcu = uptcu(tcu);
  3249.             sclup();
  3250.             loc(1,line-2);
  3251.             getgtail(tcu);
  3252.             if(ggtail->count <= ttail->count)
  3253.                 title2disp(ggtail);
  3254.             break;
  3255.         case HIDARIYA:    /* ←キー処理 */
  3256.             if(tcu == ttop) break;
  3257.             w = ggtop;
  3258.             i = tcu->count - ggtop->count;
  3259.             if(pagemode < 3) {
  3260.                 if(pagemode != 1) ggtop = mdowntcu(ggtop,line-4);
  3261.                 else {
  3262.                     ggtop = mdowntcu(ggtop,(line-4)/2);
  3263.                     i = i / 2;
  3264.                 }
  3265.                 getgtail(ggtop);
  3266.                 if(tcu->count > ggtail->count) tcu = muptcu(ggtop,i);
  3267.             }
  3268.             else {
  3269.                 ggtop = mdowntcu(ggtop,line-5);
  3270.                 getgtail(ggtop);
  3271.                 if(w == ggtop) tcu = ggtop;
  3272.                 else if(tcu->count > ggtail->count) tcu = ggtail;
  3273.             }
  3274.             continue;
  3275.         case MIGIYA:    /* →キー処理 */
  3276.             if(tcu == ttail)    break;
  3277.             xhpread(ggtail->count+line);
  3278.             i = tcu->count - ggtop->count;
  3279.             w = ggtop;
  3280.             if(pagemode < 3) {
  3281.                 if(pagemode != 1) ggtop = muptcu(ggtop,line-4);
  3282.                 else {
  3283.                     ggtop = muptcu(ggtop,(line-4)/2);
  3284.                     i = i / 2;
  3285.                 }
  3286.                 if(tcu->count < ggtop->count) tcu = muptcu(ggtop,i);
  3287.             }
  3288.             else {
  3289.                 if(ggtail != ttail) {
  3290.                     ggtop = muptcu(ggtop,line-5);
  3291.                      getgtail(ggtop);
  3292.                     if(w == ggtop) tcu = ggtail;
  3293.                     else if(tcu->count < ggtop->count) tcu = ggtop;
  3294.                 }
  3295.                 else tcu = downtcu(ttail);
  3296.             }
  3297.             continue;
  3298.         case SENTAKU:    /* 選択キー処理 */
  3299.             if(!sentaku(tcu)) break;
  3300.             goto tsita;
  3301.         case ESC:        /* ESCキー処理 */
  3302.             if(nifmode != NFNORMAL) {
  3303.                 comentclr();
  3304.                 title3disp(tcu);
  3305.                 continue;
  3306.             }
  3307.         case PF1:        /* 終了処理 */
  3308.             if(!endcheck() && endmode) {
  3309.                 if(!yesnocheck("終了してもいいですか")) {
  3310.                     xhpread(ggtail->count+line);
  3311.                     ggtop = tcu;
  3312.                     continue;
  3313.                 }
  3314.             }
  3315.             xfclose();
  3316.             return(0);
  3317.         case PF2:        /* 先頭行表示処理 */
  3318.             if(ggtop == ttop) {
  3319.                 title1disp(tcu,0);
  3320.                 tcu = ggtop;
  3321.                 break;
  3322.             }
  3323.             ggtop = tcu = ttop;
  3324.             continue;
  3325.         case PF3:        /* 最終行表示処理 */
  3326.             xhpread(MAXPOINT);
  3327.             if(ggtail == ttail) {
  3328.                 title1disp(tcu,0);
  3329.                 tcu = downtcu(ttail);
  3330.                 break;
  3331.             }
  3332.             tcu = downtcu(ttail);
  3333.             ggtop = mdowntcu(tcu,line-5);
  3334.             continue;
  3335.         case PF4:        /* ヘルプ処理 */
  3336.             help(0);
  3337.             continue;
  3338.         case PF5:        /* 切り出し処理 */
  3339.             kiridasi(tcu);
  3340.             continue;
  3341.         case PF6:        /* 削除処理 */
  3342.             if(!(i=sakujyo(tcu))) break;
  3343.             if(i == 1) continue;
  3344.             goto tsita;
  3345.         case PF7:        /* コピー処理 */
  3346.             fukusya(tcu);
  3347.             continue;
  3348.         case PF8:        /* 検索処理 */
  3349.             if(search(0)) {
  3350.                 ggtop = tcu = ttop = p_head;
  3351.                 ttail = p_tail;
  3352.                 continue;
  3353.             }
  3354.             continue;
  3355.         case PF9:        /* ID処理 */
  3356.             if(idset(tcu)) {
  3357.                 title3disp(tcu);
  3358.                 continue;
  3359.             }
  3360.             break;
  3361.         case PF10:        /* コメント処理 */
  3362.             if(w=coment(tcu,1)) {
  3363.                 tcu = w;
  3364.                 title3disp(tcu);
  3365.                 continue;
  3366.             }
  3367.             break;
  3368.         case S_PF1:        /* DOS呼び出し処理 */
  3369.             if((i=oscall()) < 0) {
  3370.                 xfclose();
  3371.                 if(i == -1) return(-4);
  3372.                 return(-5);
  3373.             }
  3374.             continue;
  3375.         case S_PF2:        /* 前ファイル移動処理 */
  3376.             tbl_set(tcu);
  3377.             for(i=tcu->p->fno-1;i >= 1;i--) {
  3378.                 _fstrcpy((char far *)buf,file[i-1]);
  3379.                 if(checkfile(buf) == 1)
  3380.                     break;
  3381.             }
  3382.             if(i < 1)
  3383.                 goto nextfno;
  3384.             if(startmode < 8) {
  3385.                 if(!endcheck()) xfclose();
  3386.                 return(-2);
  3387.             }
  3388.             w = bfindfile(i);
  3389.             goto nextfno3;
  3390.         case S_PF3:        /* 次ファイル移動処理 */
  3391.             tbl_set(tcu);
  3392.             for(i=tcu->p->fno+1;i <= maxfno;i++) {
  3393.                 _fstrcpy((char far *)buf,file[i-1]);
  3394.                 if(checkfile(buf) == 1)
  3395.                     break;
  3396.             }
  3397.             if(i > maxfno) {
  3398. nextfno:
  3399.                 errdisp1(filenoterror);
  3400.                 break;
  3401.             }
  3402.             if(startmode < 8) {
  3403.                 if(!endcheck()) xfclose();
  3404.                 return(-3);
  3405.             }
  3406.             goto nextfno2;
  3407.         case S_PF4:        /* ファイル指定処理 */
  3408.             if(!endcheck()) xfclose();
  3409.             if(maxfno == 1) return(-1);
  3410.             tbl_set(tcu);
  3411.             i = filechoice(tcu->p->fno);
  3412.             if(!i || startmode < 8)
  3413.                 return(i);
  3414. nextfno2:
  3415.             w = findfile(i);
  3416. nextfno3:
  3417.             ggtop = tcu = w;
  3418.             continue;
  3419.         case S_PF5:        /* 選択取り消し処理 */
  3420.             if(!torikesi())
  3421.                 break;
  3422.             continue;
  3423.         case S_PF6:        /* 削除取り消し処理 */
  3424.             if(!sakutorikesi())
  3425.                 break;
  3426.             continue;
  3427.         case S_PF7:        /* タグセット処理 */
  3428.             if(!tagset(tcu))
  3429.                 break;
  3430.             continue;
  3431.         case S_PF8:        /* タグ前ジャンプ処理 */
  3432.             if((w = tagmae(tcu))) {
  3433.                 tcu = w;
  3434.                 title3disp(tcu);
  3435.                 continue;
  3436.             }
  3437.             break;
  3438.         case S_PF9:        /* タグ後ろジャンプ処理 */
  3439.             if((w = tagato(tcu))) {
  3440.                 tcu = w;
  3441.                 title3disp(tcu);
  3442.                 continue;
  3443.             }
  3444.             break;
  3445.         case S_PF10:    /* 発言処理 */
  3446.             bunget(tcu,1);
  3447.             hatugen(tcu,0);
  3448.             bunbuffree();
  3449.             continue;
  3450.         case C_PF1:        /* 強制出力付き終了処理 */
  3451.             c = foutmode;
  3452.             foutmode |= F_UPDATE;
  3453.             if(!endcheck() && endmode) {
  3454.                 if(!yesnocheck("終了してもいいですか")) {
  3455.                     ggtop = tcu;
  3456.                     foutmode = c;
  3457.                     continue;
  3458.                 }
  3459.             }
  3460.             xfclose();
  3461.             return(0);
  3462.         case C_PF2:        /* タイトル出力処理 */
  3463.             titleout();
  3464.             continue;
  3465.         case C_PF3:        /* 前検索ジャンプ処理 */
  3466.             if((w = shmae(tcu,1))) {
  3467.                 tcu = w;
  3468.                 title3disp(tcu);
  3469.             }
  3470.             continue;
  3471.         case C_PF4:        /* 後ろ検索ジャンプ処理 */
  3472.             if((w = shato(tcu,1))) {
  3473.                 tcu = w;
  3474.                 title3disp(tcu);
  3475.             }
  3476.             continue;
  3477.         case C_PF5:        /* 印刷処理 */
  3478.             printsub(tcu);
  3479.             continue;
  3480.         case C_PF6:        /* ログ整理(大分類)処理 */
  3481.             logedit(0);
  3482.             continue;
  3483.         case C_PF7:        /* ログ整理(詳細分類)処理 */
  3484.             logedit(1);
  3485.             continue;
  3486.         case C_PF8:        /* 行数切り換え処理 */
  3487.             chgline(tcu);
  3488.             title3disp(tcu);
  3489.             continue;
  3490.         case C_PF9:        /* 利用者コマンド処理 */
  3491.             if((i=usertouroku(tcu,1)) < 0) {
  3492.                 xfclose();
  3493.                 if(i == -1) return(-4);
  3494.                 return(-5);
  3495.             }
  3496.             continue;
  3497.         case C_PF10:    /* 自動表示処理 */
  3498.             if((w = autodisp(tcu))) {
  3499.                 tcu = w;
  3500.                 title3disp(tcu);
  3501.                 continue;
  3502.             }
  3503.             break;
  3504.         case SC_PF1:    /* 既読記憶出力せず終了 */
  3505.             i = midokumode;
  3506.             midokumode |= 2;
  3507.             if(!endcheck() && endmode) {
  3508.                 if(!yesnocheck("終了してもいいですか")) {
  3509.                     ggtop = tcu;
  3510.                     midokumode = i;
  3511.                     continue;
  3512.                 }
  3513.             }
  3514.             xfclose();
  3515.             return(0);
  3516.         case SC_PF2:    /* ジャンプ10処理 */
  3517.             if((w = nextjump(tcu,9))) {
  3518.                 tcu = w;
  3519.                 title3disp(tcu);
  3520.                 continue;
  3521.             }
  3522.             break;
  3523.         case SC_PF3:    /* ジャンプ20処理 */
  3524.             if((w = nextjump(tcu,19))) {
  3525.                 tcu = w;
  3526.                 title3disp(tcu);
  3527.                 continue;
  3528.             }
  3529.             break;
  3530.         case SC_PF4:    /* ジャンプ50処理 */
  3531.             if((w = nextjump(tcu,49))) {
  3532.                 tcu = w;
  3533.                 title3disp(tcu);
  3534.                 continue;
  3535.             }
  3536.             break;
  3537.         case SC_PF5:    /* 既読セット処理 */
  3538.             if(kidokuset(tcu)) {
  3539.                 title3disp(tcu);
  3540.                 continue;
  3541.             }
  3542.             break;
  3543.         case SC_PF6:    /* 既読キャンセル処理 */
  3544.             if(kidokucancel(tcu)) {
  3545.                 title3disp(tcu);
  3546.                 continue;
  3547.             }
  3548.             break;
  3549.         case SC_PF7:    /* ジャンプモード切替え処理 */
  3550.             jumpmodechg();
  3551.             continue;
  3552.         case SC_PF8:    /* タイプ処理 */
  3553.             typedisp(tcu);
  3554.             continue;
  3555.         case SC_PF9:    /* コメント+ID処理 */
  3556.             if(comentid(tcu)) {
  3557.                 title3disp(tcu);
  3558.                 continue;
  3559.             }
  3560.             break;
  3561.         case SC_PF10:    /* 発言2処理 */
  3562.             bunget(tcu,1);
  3563.             hatugen(tcu,1);
  3564.             bunbuffree();
  3565.             continue;
  3566.         default:        /* 無効キー処理 */
  3567.             break;
  3568.         }
  3569.         goto keyreadt;
  3570.     }
  3571. }
  3572.  
  3573. static char *equsearch(char *buf)
  3574. {
  3575.     char *op;
  3576.  
  3577.     if((op = jstrchr(buf,'='))) op++;
  3578.     else op = "";
  3579.     return(op);
  3580. }
  3581.  
  3582. static int envsetsub0(char *o)
  3583. {
  3584.     int w;
  3585.  
  3586.     if(!isdigit(o[0])) return(0);
  3587.     w = o[0] - '0';
  3588.     if(!o[1] || !isdigit(o[1])) return(w);
  3589.     w = w*10 +(o[1] - '0');
  3590.     if(!o[2] || !isdigit(o[2])) return(w);
  3591.     w = w*10 +(o[2] - '0');
  3592.     return(w);
  3593. }
  3594.  
  3595. static int envsetsub1(char *o)
  3596. {
  3597.     if(isdigit(o[0])) return(o[0] - '0');
  3598.     else return(0);
  3599. }
  3600.  
  3601. #define MAXPARACK 52
  3602. static char *parack[MAXPARACK] = {
  3603.     "エ",
  3604.     "行",
  3605.     "タイプ",
  3606.     "切り出し",
  3607.     "発言先",
  3608.     "キ",
  3609.     "色",
  3610.     "ロ",
  3611.     "ヘッダ文",
  3612.     "フッタ文",
  3613.     "メッセージ文",
  3614.     "ヘッダ2",
  3615.     "フッタ2",
  3616.     "メッセージ2",
  3617.     "確認",
  3618.     "コ",
  3619.     "利",
  3620.     "タイトル出",
  3621.     "Y",
  3622.     "強",
  3623.     "修",
  3624.     "戻",
  3625.     "ジ",
  3626.     "マ",
  3627.     "時",
  3628.     "カ",
  3629.     "バ",
  3630.     "印刷プロ",
  3631.     "起",
  3632.     "待",
  3633.     "自",
  3634.     "読",
  3635.     "V",
  3636.     "ソートモ",
  3637.     "ソート2",
  3638.     "頁",
  3639.     "ツ",
  3640.     "T",
  3641.     "先",
  3642.     "タイト",
  3643.     "記",
  3644.     "未",
  3645.     "タイトル表",
  3646.     "セパ",
  3647.     "印刷セパ",
  3648.     "サフ",
  3649.     "PF",
  3650.     "ログ",
  3651.     "タイム",
  3652.     "ESC",
  3653.     "EMS",
  3654.     "フォーラム"
  3655. };
  3656.  
  3657. static int envsetsub2(char *buf)
  3658. {
  3659.     int i;
  3660.  
  3661.     for(i=0;i < MAXPARACK;i++) {
  3662.         if(!xstrncmp(buf,parack[i]))
  3663.             return(i);
  3664.     }
  3665.     return(-1);
  3666. }
  3667.  
  3668. static int cnv16(char o)
  3669. {
  3670.     int i;
  3671.  
  3672.     i = (int)o;
  3673.     if(i >= '0' && i <= '9') i -= '0';
  3674.     else if(i >= 'a' && i <= 'f') i -= 'a'-10;
  3675.     else if(i >= 'A' && i <= 'F') i -= 'A'-10;
  3676.     else i = 0;
  3677.     return(i);
  3678. }
  3679.  
  3680. static void envsetsub3(FILE *fd1,char *buf)
  3681. {
  3682.     char *o,*op,*p;
  3683.     int i,w,k;
  3684.     char work[51];
  3685.  
  3686.     o = equsearch(buf);
  3687.     i = envsetsub2(buf);
  3688.     switch(i) {
  3689.     case 0:        /* "エ" */
  3690.         if(o) xxstrncpy(editer,o,40);
  3691.         return;
  3692.     case 1:        /* "行" */
  3693.         if(o) line = envsetsub0(o);
  3694.         return;
  3695.     case 2:        /* "タイプ" */
  3696.         if(o) typespeed = envsetsub0(o);
  3697.         return;
  3698.     case 3:        /* "切り出し" */
  3699.         if(o) xxstrncpy50(kiridir,o);
  3700.         return;
  3701.     case 4:        /* "発言先" */
  3702.         if(o) xxstrncpy50(hatudir,o);
  3703.         return;
  3704.     case 5:        /* "キ" */
  3705.         for(k=0;k < 256;k++)
  3706.             keytbl[k] = 0;
  3707.         for(k=0;k < 47 && fgets(buf,81,fd1);) {
  3708.             rtncut(buf);
  3709.             if(!isdigit(buf[0])) return;
  3710.             o = equsearch(buf);
  3711.             i = k;
  3712.             if(i < 10) i += 0x81;
  3713.             else if(i < 20) i += 0xa1-10;
  3714.             else if(i < 30) i += 0xc1-20;
  3715.             else if(i < 40) i += 0xf5-30;
  3716.             else if(i < 44) i += 0x90-40;
  3717.             else if(i == 44) i = 0xff;
  3718.             else if(i == 45) i = 0x0d;
  3719.             else i = 0x1b;
  3720.             if(*o) {
  3721.                 for(;*o;) {
  3722.                     op = jstrchr(o,',');
  3723.                     if(!op) {
  3724.                         op = o;
  3725.                         op += strlen(o);
  3726.                     }
  3727.                     else *op++ = 0;
  3728.                     if(o[0] == 0x27 && o[1]) {
  3729.                         w = (int)o[1];
  3730.                     }
  3731.                     else if(o[0] == '^' && o[1] >= '@' && o[1] <= '_') {
  3732.                         w = (int)(o[1] - '@');
  3733.                     }
  3734.                     else if(o[0]) {
  3735.                         w = cnv16(o[0]);
  3736.                         if(o[1]) w = w*16 + cnv16(o[1]);
  3737.                     }
  3738.                     keytbl[w] = i;
  3739.                     o = op;
  3740.                 }
  3741.             }
  3742.             else {
  3743.                 if(k < 40) {
  3744.                  keytbl[i] = 0;
  3745.                 }
  3746.             }
  3747.             k++;
  3748.         }
  3749.         return;
  3750.     case 6:        /* "色" */
  3751.         for(i=0;i < IROMAX && fgets(buf,81,fd1);) {
  3752.             rtncut(buf);
  3753.             if(!isdigit(buf[0])) return;
  3754.             o = equsearch(buf);
  3755.             if(w = envsetsub0(o)) {
  3756. /*                if(w < 0 || w > 63) w = 7; */
  3757.                 irotbl[i] = w;
  3758.             }
  3759.             i++;
  3760.         }
  3761.         return;
  3762.     case 7:        /* "ロ" */
  3763.         for(i=0;i < LOGDIRMAX && fgets(buf,81,fd1);) {
  3764.             rtncut(buf);
  3765.             if(!isdigit(buf[0])) return;
  3766.             o = equsearch(buf);
  3767.             if(o[0]) {
  3768.                 if(!(logdir[i]=farmalloc(strlen(o)+1))) {
  3769.                     errdisp1(memgeterror);
  3770.                     break;
  3771.                 }
  3772.                 _fstrcpy(logdir[i],(char far *)o);
  3773.             }
  3774.             i++;
  3775.             if(i == LETC+1) fgets(buf,81,fd1);
  3776.         }
  3777.         return;
  3778.     case 8:        /* "ヘッダ文" */
  3779.         for(i=0;i < 4 && fgets(buf,257+13,fd1);) {
  3780.             rtncut(buf);
  3781.             if(!isdigit(buf[0])) return;
  3782.             o = equsearch(buf);
  3783.             if(o[0]) strcpy(hatutop[0][i],o);
  3784.             i++;
  3785.         }
  3786.         return;
  3787.     case 9:        /* "フッタ文" */
  3788.         for(i=0;i < 4 && fgets(buf,257+13,fd1);) {
  3789.             rtncut(buf);
  3790.             if(!isdigit(buf[0])) return;
  3791.             o = equsearch(buf);
  3792.             if(o[0]) strcpy(hatuend[0][i],o);
  3793.             i++;
  3794.         }
  3795.         return;
  3796.     case 10:    /* "メッセージ文" */
  3797.         for(i=0;i < 4 && fgets(buf,21+13,fd1);) {
  3798.             rtncut(buf);
  3799.             if(!isdigit(buf[0])) return;
  3800.             o = equsearch(buf);
  3801.             if(o[0]) strcpy(messtring[0][i],o);
  3802.             i++;
  3803.         }
  3804.         return;
  3805.     case 11:    /* "ヘッダ2" */
  3806.         for(i=0;i < 4 && fgets(buf,257+13,fd1);) {
  3807.             rtncut(buf);
  3808.             if(!isdigit(buf[0])) return;
  3809.             o = equsearch(buf);
  3810.             if(o[0]) strcpy(hatutop[1][i],o);
  3811.             i++;
  3812.         }
  3813.         return;
  3814.     case 12:    /* "フッタ2" */
  3815.         for(i=0;i < 4 && fgets(buf,257+13,fd1);) {
  3816.             rtncut(buf);
  3817.             if(!isdigit(buf[0])) return;
  3818.             o = equsearch(buf);
  3819.             if(o[0]) strcpy(hatuend[1][i],o);
  3820.             i++;
  3821.         }
  3822.         return;
  3823.     case 13:    /* "メッセージ2" */
  3824.         for(i=0;i < 4 && fgets(buf,21+13,fd1);) {
  3825.             rtncut(buf);
  3826.             if(!isdigit(buf[0])) return;
  3827.             o = equsearch(buf);
  3828.             if(o[0]) strcpy(messtring[1][i],o);
  3829.             i++;
  3830.         }
  3831.         return;
  3832.     case 14:    /* "確認" */
  3833.         if(o) endmode = envsetsub1(o);
  3834.         return;
  3835.     case 15:    /* "コ" */
  3836.         for(i=0;i < 3 && fgets(buf,129+13,fd1);) {
  3837.             rtncut(buf);
  3838.             if(!isdigit(buf[0])) return;
  3839.             o = equsearch(buf);
  3840.             if(o[0]) strcpy(kiridashitop[i],o);
  3841.             i++;
  3842.         }
  3843.         return;
  3844.     case 16:    /* "利" */
  3845.         for(i=0;i < 15 && fgets(buf,129+13,fd1);) {
  3846.             rtncut(buf);
  3847.             if(!isalnum(buf[0])) return;
  3848.             if(buf[0] == ';') return;
  3849.             o = equsearch(buf);
  3850.             if(o[0]) strncpy(cmdtbl[i],o,40);
  3851.             i++;
  3852.         }
  3853.         return;
  3854.     case 17:    /* "タイトル出" */
  3855.         if(o) xxstrncpy50(titledir,o);
  3856.         return;
  3857.     case 18:    /* "Y" */
  3858.         if(o) yesnomode = envsetsub1(o);
  3859.         return;
  3860.     case 19:    /* "強" */
  3861.         if(o) sakujyomode = envsetsub1(o);
  3862.         return;
  3863.     case 20:    /* "修" */
  3864.         if(o) editmode = envsetsub1(o);
  3865.         return;
  3866.     case 21:    /* "戻" */
  3867.         if(o) returnmode = envsetsub1(o);
  3868.         return;
  3869.     case 22:    /* "ジ" */
  3870.         if(o) nextmode = envsetsub1(o);
  3871.         return;
  3872.     case 23:    /* "マ" */
  3873.         if(o) tabcrmode = envsetsub1(o);
  3874.         return;
  3875.     case 24:    /* "時" */
  3876.         if(o) jikokumode = envsetsub1(o);
  3877.         return;
  3878.     case 25:    /* "カ" */
  3879.         if(o) cutmode = envsetsub1(o);
  3880.         for(i=0;i < MAXCUTNO && fgets(buf,81,fd1);) {
  3881.             rtncut(buf);
  3882.             if(!isdigit(buf[0])) return;
  3883.             if(!(cutstrtbl[i]=farmalloc(strlen(buf)+1)))
  3884.                 errdisp1(memgeterror);
  3885.             else _fstrcpy(cutstrtbl[i],(char far *)buf);
  3886.             i++;
  3887.         }
  3888.         return;
  3889.     case 26:    /* "バ" */
  3890.         if(o) {
  3891.             for(i=k=0;o[i] && k < 50;i++) {
  3892.                 if(iskanji(o[i]) && iskanji2(o[i+1])) {
  3893.                     bakdir[k++] = o[i++];
  3894.                     bakdir[k++] = o[i];
  3895.                     continue;
  3896.                 }
  3897.                 if(o[i] == '%') {
  3898.                     op = &o[i+1];
  3899.                     if(p = jstrchr(op,'%')) {
  3900.                         *p++ = 0;
  3901.                         strcpy(work,op);
  3902.                         strupr(work);
  3903.                         i += strlen(op) + 1;
  3904.                         if(op = getenv(work)) {
  3905.                             strcpy(&bakdir[k],op);
  3906.                             k += strlen(op);
  3907.                         }
  3908.                         continue;
  3909.                     }
  3910.                 }
  3911.                 bakdir[k++] = o[i];
  3912.             }
  3913.             bakdir[k] = 0;
  3914.         }
  3915.         return;
  3916.     case 27:    /* "印刷プロ" */
  3917.         if(o) xxstrncpy(printprg,o,40);
  3918.         return;
  3919.     case 28:    /* "起" */
  3920.         if(o) startmode = envsetsub1(o);
  3921.         return;
  3922.     case 29:    /* "待" */
  3923.         if(o) waittimes = envsetsub1(o);
  3924.         return;
  3925.     case 30:    /* "自" */
  3926.         if(o) autodisptime2 = envsetsub0(o);
  3927.         return;
  3928.     case 31:    /* "読" */
  3929.         if(o) titlecount = envsetsub0(o);
  3930.         return;
  3931.     case 32:    /* "V" */
  3932.         if(o) vrammode = envsetsub1(o);
  3933.         return;
  3934.     case 33:    /* "ソートモ" */
  3935.         if(o) fsortmode = envsetsub1(o);
  3936.         return;
  3937.     case 34:    /* "ソート2" */
  3938.         if(o) fsort2mode = envsetsub1(o);
  3939.         return;
  3940.     case 35:    /* "頁" */
  3941.         if(o) pagemode = (char)envsetsub1(o);
  3942.         return;
  3943.     case 36:    /* "ツ" */
  3944.         if(o)
  3945.             for(w=0;o[w*2] && w<4;w++) {
  3946.                 treechar[w*3] = o[w*2];
  3947.                 treechar[w*3+1] = o[w*2+1];
  3948.                 treechar[w*3+2] = 0;
  3949.             }
  3950.         return;
  3951.     case 37:    /* "T" */
  3952.         if(o) tabno = envsetsub1(o);
  3953.         return;
  3954.     case 38:    /* "先" */
  3955.         if(o) topendmode = envsetsub1(o);
  3956.         return;
  3957.     case 39:    /* "タイト" */
  3958.         if(o) xxstrncpy(touttop,o,128);
  3959.         return;
  3960.     case 40:    /* "記" */
  3961.         if(o) xxstrncpy(datfile,o,128);
  3962.         return;
  3963.     case 41:    /* "未" */
  3964.         if(o) tagmode = (char)envsetsub1(o);
  3965.         return;
  3966.     case 42:    /* "タイトル表" */
  3967.         if(o) titlemode = (char)envsetsub1(o);
  3968.         return;
  3969.     case 43:    /* "セパ" */
  3970.         if(o) sepamode = (char)envsetsub1(o);
  3971.         return;
  3972.     case 44:    /* "印刷セパ" */
  3973.         if(o) xxstrncpy(prtsepa,o,128);
  3974.         return;
  3975.     case 45:    /* "サフ" */
  3976.         for(i=0;i < 2 && fgets(buf,129+13,fd1);) {
  3977.             rtncut(buf);
  3978.             if(!isdigit(buf[0])) return;
  3979.             o = equsearch(buf);
  3980.             if(o[0]) {
  3981.                 if(i == 0) strncpy(savsafix,o,3);
  3982.                 else       strncpy(nifsafix,o,3);
  3983.             }
  3984.             i++;
  3985.         }
  3986.         return;
  3987.     case 46:    /* "PF" */
  3988.         if(o) keyshiftmode = (char)envsetsub1(o);
  3989.         return;
  3990.     case 47:    /* "ログ" */
  3991.         if(o) passmode = (char)envsetsub1(o);
  3992.         return;
  3993.     case 48:    /* "タイム" */
  3994.         if(o) timechkmode = (char)envsetsub1(o);
  3995.         return;
  3996.     case 49:    /* "ESC" */
  3997.         for(i=0;i < 2 && fgets(buf,128,fd1);) {
  3998.             rtncut(buf);
  3999.             if(!isdigit(buf[0])) return;
  4000.             o = equsearch(buf);
  4001.             if(*o) {
  4002.                 if(i == 0) op = ESCin;
  4003.                 else       op = ESCout;
  4004.                 for(;*o;) {
  4005.                     if(o[0] == '^' && o[1] != '^') {
  4006.                         *op++ = (char)o[1] - 0x40;
  4007.                         o++;
  4008.                     }
  4009.                     else *op++ = *o;
  4010.                     o++;
  4011.                 }
  4012.                 *op = 0;
  4013.             }
  4014.             i++;
  4015.         }
  4016.         return;
  4017.     case 50:    /* "EMSページ数" */
  4018.         if(o) emsno = (char)envsetsub0(o);
  4019.         return;
  4020.     case 51:    /* "フォーラム" */
  4021.         for(i=0;i < MAXMSGNO && fgets(buf,81,fd1);) {
  4022.             rtncut(buf);
  4023.             if(!isdigit(buf[0])) return;
  4024.             if(!(msgstrtbl[i]=farmalloc(strlen(buf)+1)))
  4025.                 errdisp1(memgeterror);
  4026.             else _fstrcpy(msgstrtbl[i],(char far *)buf);
  4027.             i++;
  4028.         }
  4029.         return;
  4030.     }
  4031. }
  4032.  
  4033. static char path[256];
  4034. static int envset(char **argv)    /* 環境ファイル読み込み */
  4035. {
  4036.     FILE *fd1;
  4037.     char c,*o,buf[300];
  4038.     long ep;
  4039.     int i;
  4040.  
  4041.     for(ep = 0;ep < FMAXFILE;ep++)
  4042.         file[ep] = (char far *)0;
  4043.     for(ep = 0;ep < MAXDATF;ep++)
  4044.         datf[ep] = (char far *)0;
  4045.     for(ep = 0;ep < LOGDIRMAX;ep++)
  4046.         logdir[ep] = (char far *)0;
  4047.     for(ep = 0;ep < 4;ep++) {
  4048.         hatutop[0][ep][0] = hatutop[1][ep][0] = 0;
  4049.         hatuend[0][ep][0] = hatuend[1][ep][0] = 0;
  4050.         messtring[0][ep][0] = messtring[1][ep][0] = 0;
  4051.     }
  4052.     for(ep = 0;ep < 3;ep++)
  4053.         kiridashitop[ep][0] = 0;
  4054.     for(ep = 0;ep < 15;ep++)
  4055.         memset(cmdtbl[ep],0,41);
  4056.     for(ep = 0;ep < MAXCUTNO;ep++)
  4057.         cutstrtbl[ep] = (char far *)0;
  4058.     for(ep = 0;ep < MAXMSGNO;ep++)
  4059.         msgstrtbl[ep] = (char far *)0;
  4060.     for(i=0;i<4;i++)
  4061.         treechar[i*3+2] = 0;
  4062.     memset(filename,0,129);
  4063.     for(i=0;(c=argv[0][i]);i++) {
  4064.                 if (c == '.') break;
  4065.                 path[i] = c;
  4066.     }
  4067.     path[i] = 0;
  4068.     strcat(path,".cfg");
  4069.     if(!(fd1 = fopen(path,"rt"))) {
  4070.         if(!(o = searchpath("NIFP.CFG")))
  4071.             return(1);
  4072.         strcpy(path,o);
  4073.         if(!(fd1 = fopen(path,"rt")))
  4074.             return(1);
  4075.     }
  4076.     if(fgets(buf,256,fd1)) {
  4077.         if(xstrncmp(&buf[1],cfgversion)) {
  4078.             fclose(fd1);
  4079.             return(2);
  4080.         }
  4081.     }
  4082.     else {
  4083.         fclose(fd1);
  4084.         return(1);
  4085.     }
  4086.     for(;fgets(buf,256,fd1);) {
  4087.         if(buf[0] == ';') continue;
  4088.         rtncut(buf);
  4089.         envsetsub3(fd1,buf);
  4090.     }
  4091.     fclose(fd1);
  4092.     return(0);
  4093. }
  4094.  
  4095. static void main_sub1(char *buf,char batmode)
  4096. {
  4097.     if(!batmode) {
  4098.         loc(10,5);
  4099.         eprintf(buf);
  4100.         loc(10,6);
  4101.         eprintf("何かキーを押してください。");
  4102.         keyget();
  4103.     }
  4104.     else {
  4105.         printf("\n\033[31m%s\033[0m\n",buf);
  4106.     }
  4107. }
  4108.  
  4109. static void tbl_rtn(void)
  4110. {
  4111.     PCELL far *pp;
  4112.     PCELL3 far *pt1;
  4113.     PCELL3 far *wk;
  4114.  
  4115.     if(rsv_p) {
  4116.         tbl_free(rsv_p);
  4117.         rsv_p = (PCELL far *)0;
  4118.     }
  4119.     if(emsno) {
  4120.         ems_free();
  4121.     }
  4122.     else {
  4123.         for(pp = p_freetop;pp;pp=pp->next) {
  4124.             if(!pp->lno)
  4125.                 farfree(pp->p);
  4126.         }
  4127.         p_freetop = (PCELL far *)0;
  4128.     }
  4129.     for(pt1 = p_tbltop;pt1;) {
  4130.         wk = pt1->next;
  4131.         farfree(pt1);
  4132.         pt1 = wk;
  4133.     }
  4134.     p_tbltop = (PCELL3 far *)0;
  4135. }
  4136.  
  4137. static int handler(void)
  4138. {
  4139.     hardresume(0);
  4140. }
  4141.  
  4142. int main (int argc, char **argv)    /* NIFPメイン */
  4143. {
  4144.     FILE *fd1;
  4145.     int rcode,i,j,k,l,lmode;
  4146.     long ep;
  4147.     char a,fname[129],buf[180],*w;
  4148.     int savefno;
  4149.     PCELL far *pp;
  4150.     PCELL far *wp;
  4151.     char batmode=0,*fmode=(char *)0;
  4152.     PCELL3 far *pt1;
  4153.     PCELL3 far *wk;
  4154.     struct stat sbuf;
  4155.  
  4156.     segread(&sregs);
  4157.     harderr((int (*)())handler);
  4158.  
  4159.     switch(envset(argv)) {
  4160.     case 1: main_sub1("NIFP.CFGファイルが見つかりません。",batmode);
  4161.             break;
  4162.     case 2:    main_sub1("NIFP.CFGファイルの版数が違っています。",batmode);
  4163.             break;
  4164.     }
  4165.     for(k=1,l=0,j=argc;k < j;k++) {
  4166.         if(*argv[k] == '-' && !*(argv[k]+2)) {
  4167.             switch(*(argv[k]+1)) {
  4168.             case 'a':
  4169.             case 'A': fmode = argv[++k]; break;
  4170.             case 'm': midokumode |= 1; break;
  4171.             case 'M': midokumode |= 2; break;
  4172.             case 'o':
  4173.             case 'O': batmode = 1; break;
  4174.             case 'p':
  4175.             case 'P': batmode = 2; break;
  4176.             case 'x':
  4177.             case 'X': startmode = 8; break;
  4178.             case 'c': startmode = (startmode & 1) + 6; break;
  4179.             case 'C': startmode = (startmode & 1) + 4; break;
  4180.             }
  4181.         }
  4182.         else {
  4183.             l++;
  4184.         }
  4185.     }
  4186.     if(startmode >= 8) tagmode = 0;
  4187.     if(!batmode) {
  4188.         setcon(0);
  4189.         csloff();
  4190.         saveline = getline();
  4191.         switch(line) {
  4192.         case 1: chglowline(); break;
  4193.         case 2: chghighline(); break;
  4194.         }
  4195.         line = getline();
  4196.         setline(line);
  4197.         line = getline();
  4198.         allclr();
  4199.         nifmode = NFNORMAL;
  4200.         topdisp();
  4201.     }
  4202.     if(l == 1) {
  4203.         for(i=1;i < argc;i++) {
  4204.             if(argv[i][0] != '-') break;
  4205.         }
  4206.         if(i >= argc) i--;
  4207.         w = argv[i];
  4208.         strcpy(filename,w);
  4209.         if(!checkfile(filename))
  4210.             argc = 1;
  4211.     }
  4212.     if(fmode) {
  4213.         fd1 = fopen(fmode, "rt");
  4214.         if(!fd1) {
  4215.             main_sub1("指定ファイルリストがオープンできません。",batmode);
  4216.             goto owari;
  4217.         }
  4218.         for(j = 0;j < FMAXFILE;) {
  4219.             if(!(fgets(buf,81,fd1)))
  4220.                 break;
  4221.             rtncut(buf);
  4222.             if(w = jstrchr(buf,' '))
  4223.                 *w = 0;
  4224.             if(checkfile(buf) == 1) {
  4225.                 if(set2_tree(buf)) continue;
  4226.                 j++;
  4227.             }
  4228.         }
  4229.         fclose(fd1);
  4230.         if(!j) {
  4231.             main_sub1(filenoerror,batmode);
  4232.             goto owari;
  4233.         }
  4234.         for(i = 0,tree2_pos = tree2_top; i < j;) {
  4235.             if(tree2_pos->file) {
  4236.                 file[i++] = tree2_pos->file;
  4237.             }
  4238.             else j--;
  4239.             tree2_pos = tree2_pos->next;
  4240.         }
  4241.         maxfno = j;
  4242.         tree2free();
  4243.         if(j == 1) _fstrcpy((char far *)filename,file[0]);
  4244.     }
  4245.     else {
  4246.         if(l <= 1) maxfno = 1;
  4247.         else {
  4248.             for(i = 1,j = 0;i < argc && j < FMAXFILE;i++) {
  4249.                 if(argv[i][0] == '-') continue;
  4250.                 strcpy(buf,argv[i]);
  4251.                 if(checkfile(buf) == 1) {
  4252.                     if(set2_tree(buf)) continue;
  4253.                     j++;
  4254.                 }
  4255.             }
  4256.             if(!j) {
  4257.                 main_sub1(filenoerror,batmode);
  4258.                 if(batmode) goto owari;
  4259.                 else        goto fileset;
  4260.             }
  4261.             for(i = 0,tree2_pos = tree2_top; i < j;) {
  4262.                 if(tree2_pos->file) {
  4263.                     file[i++] = tree2_pos->file;
  4264.                 }
  4265.                 else j--;
  4266.                 tree2_pos = tree2_pos->next;
  4267.             }
  4268.             maxfno = j;
  4269.             tree2free();
  4270.             if(j == 1) _fstrcpy((char far *)filename,file[0]);
  4271.         }
  4272.     }
  4273.     fno = 1;
  4274.     if(!batmode) {
  4275.         if((tagmode == 1) || (tagmode == 2)) {
  4276.             if(fd1 = fopen(datfile,"rt")) {
  4277.                 for(i=0;fgets(buf,140,fd1);i++) {
  4278.                     rtncut(buf);
  4279.                     if(!(datf[i] = farmalloc(strlen(buf)+1))) {
  4280.                         main_sub1(memgeterror,batmode);
  4281.                         break;
  4282.                     }
  4283.                     _fstrcpy(datf[i],(char far *)buf);
  4284.                 }
  4285.                 fclose(fd1);
  4286.             }
  4287.         }
  4288. /*        setline(line);
  4289.         line = getline();
  4290.         allclr();
  4291.         nifmode = NFNORMAL;
  4292.         topdisp(); */
  4293.         if((startmode < 8) && (startmode & 1) && (maxfno > 1))
  4294.             fno = filechoice(1);
  4295.     }
  4296. /*    ems_count = 0;
  4297.     p_tbltop = (PCELL3 far *)0;
  4298.     p_freetop = (PCELL far *)0;
  4299.     if(emsno) {
  4300.         if(ems_check()) {
  4301.             if(tbl_alloc(1) == (PCELL far *)0) {
  4302.                 emsno = 0;
  4303.             }
  4304.         }
  4305.         else {
  4306.             emsno = 0;
  4307.         }
  4308.     }
  4309.     if(!emsno) {
  4310.         if(tbl_alloc(1) == (PCELL far *)0) {
  4311.             main_sub1(memgeterror,batmode);
  4312.             goto owari;
  4313.         }
  4314.     } */
  4315.     lmode = 0;
  4316.     for(;fno && fno <= maxfno;) {
  4317. /*        if(!rsv_p) {
  4318.             rsv_p = tbl_alloc(0);
  4319.             if(!rsv_p) {
  4320.                 main_sub1(memgeterror,batmode);
  4321.                 goto owari;
  4322.             }
  4323.         } */
  4324.         if(argc == 1)
  4325.             goto fileset;
  4326. start:
  4327.         if(!batmode) {
  4328.             allclr();
  4329.             nifmode = NFNORMAL;
  4330.             tmode = 1;
  4331.             pfset();
  4332.             topdisp();
  4333.         }
  4334.         if(maxfno > 1) _fstrcpy((char far *)filename,file[fno-1]);
  4335.         fd = xfopen(filename);
  4336.         if(!fd) {
  4337.             sprintf(buf,"%sファイルがオープンできません。",gfilename);
  4338.             main_sub1(buf,batmode);
  4339.             if(maxfno == 1) {
  4340.                 if(batmode) goto owari;
  4341.                 else        goto fileset;
  4342.             }
  4343.             if(lmode) {
  4344.                 fno--;
  4345.                 if(fno < 1)
  4346.                     goto owari;
  4347.             }
  4348.             else {
  4349.                 fno++;
  4350.                 if(fno > maxfno)
  4351.                     goto owari;
  4352.             }
  4353.             continue;
  4354.         }
  4355.         stat(filename,&sbuf);
  4356.         saveatime = sbuf.st_atime;
  4357.         cfno = fno;
  4358.         p_top=p_head=p_tail=(PCELL far *)0;
  4359.         if(!batmode) {
  4360.             deforutoiro();
  4361.             stsdisp();
  4362.             loc(39,line-1);iro(ILINE);
  4363.             if(!erron) {
  4364.                 sprintf(buf," %3d/%3dファイル    0/   0タイトル  ----- ライン   ",fno,maxfno);
  4365.                 print(buf);
  4366.             }
  4367.         }
  4368.         else
  4369.             printf("%sファイルのログを読み込み処理中です。\n",filename);
  4370.  
  4371.         ems_count = 0;
  4372.         p_tbltop = (PCELL3 far *)0;
  4373.         p_freetop = (PCELL far *)0;
  4374.         if(emsno) {
  4375.             if(ems_check()) {
  4376.                 if(tbl_alloc(1) == (PCELL far *)0) {
  4377.                     emsno = 0;
  4378.                 }
  4379.             }
  4380.             else {
  4381.                 emsno = 0;
  4382.             }
  4383.         }
  4384.         if(!emsno) {
  4385.             if(tbl_alloc(1) == (PCELL far *)0) {
  4386.                 main_sub1(memgeterror,batmode);
  4387.                 goto owari;
  4388.             }
  4389.         }
  4390.         if(!rsv_p) {
  4391.             rsv_p = tbl_alloc(0);
  4392.             if(!rsv_p) {
  4393.                 main_sub1(memgeterror,batmode);
  4394.                 goto owari;
  4395.             }
  4396.         }
  4397.         p = 0;
  4398.         p_linecount = 0;
  4399.         sentakuno = 0;
  4400.         sakujyono = 0;
  4401.         tagno = 0;
  4402.         savepno = -1;
  4403.         gp = 0;
  4404.         savehpread=0;
  4405.         jumpon=1;
  4406.         jpp = savepp = fsavepp = 0;
  4407.         jpplno = savepplno = 0;
  4408.         nmode = 0;
  4409.         foutmode = 0;
  4410.         hpid[0] = 0;
  4411.         niftyid[0] = 0;
  4412.         hpmsg[0] = 0;
  4413.         forummsg[0] = 0;
  4414.         forumname[0] = 0;
  4415.         heya[0] = 0;
  4416.         preno=0;
  4417.         saveheya[0] = 0;
  4418.         savebuf[0] = 0;
  4419.         fmeslibno = 0;
  4420.         pend = 0;
  4421.         sp = 0;
  4422.         passflag = 0;
  4423.         logproc = 0;
  4424.         forum3msgp = 0;
  4425.         k = -1;
  4426.         memset(datfile_s,0,140);
  4427.         if(!fupmode && ((tagmode == 1) || (tagmode == 2)))
  4428.             k = datf_src(filename,1);
  4429.  
  4430.         savefno = fno;
  4431.         if(batmode) {
  4432.             erron=2;
  4433.             hpread(MAXPOINT,0);
  4434.         }
  4435.         else if((k != -1) || startmode > 1) hpread(MAXPOINT,fupmode+1);
  4436.         else                                hpread(line,fupmode+1);
  4437.         fno = savefno;
  4438.         if(!p) {
  4439.             xfclose();
  4440.             main_sub1("ログデータがありません。",batmode);
  4441.             tbl_rtn();
  4442.             if(maxfno == 1 || startmode >= 8) {
  4443.                 if(batmode) goto owari;
  4444.                 else        goto fileset;
  4445.             }
  4446.             if(lmode) {
  4447.                 fno--;
  4448.                 if(fno < 1)
  4449.                     goto owari;
  4450.             }
  4451.             else {
  4452.                 fno++;
  4453.                 if(!batmode && fno > maxfno)
  4454.                     goto owari;
  4455.             }
  4456.             continue;
  4457.         }
  4458.         if(!batmode) {
  4459.             ep = 0;
  4460.             if(k != -1) {
  4461.                 _fstrcpy((char far *)buf,datf[k]);
  4462.                 w=jstrchr(buf,' ');
  4463.                 if(w[1] == '@') ep = atol(&w[2]);
  4464.                 else            ep = atol(&w[1]);
  4465.             }
  4466.             if(tagmode == 3)
  4467.                 ep = -1;
  4468.             if(tagmode == 4)
  4469.                 ep = -2;
  4470.             rcode = titledisp(ep);
  4471.             if(!fupmode && ((tagmode == 1) || (tagmode == 2))) {
  4472.                 if(k != -1) {
  4473.                     farfree(datf[k]);
  4474.                     datf[k] = 0;
  4475.                 }
  4476.                 else {
  4477.                     for(k=0;datf[k];k++)
  4478.                         ;
  4479.                 }
  4480.                 if(midokuno) {
  4481.                     if(midokuno < 0)
  4482.                         sprintf(buf,"%s @%d",datfile_s,0-midokuno);
  4483.                     else
  4484.                         sprintf(buf,"%s %d",datfile_s,midokuno);
  4485.                     if(!(datf[k]=farmalloc(strlen(buf)+1)))
  4486.                         errdisp1(memgeterror);
  4487.                     else _fstrcpy(datf[k],(char far *)buf);
  4488.                 }
  4489.             }
  4490.         }
  4491.         else {
  4492.             logeditx(batmode-1);
  4493.             xfclose();
  4494.             rcode = -3;
  4495.         }
  4496.         for(pp = p_tail;pp;) {
  4497.             wp = pp->back;
  4498.             tbl_free(pp);
  4499.             pp = wp;
  4500.         }
  4501.         tbl_rtn();
  4502.         fupmode = 0;
  4503.         if(!rcode)    break;
  4504.         if(rcode == -1) {
  4505. fileset:
  4506.             sprintf(buf, "ログファイル名 = ");
  4507.             fname[0] = 50;
  4508.             strcpy(&fname[2],filename);
  4509.             cgetfsx(buf, fname);
  4510.             if(!fname[2])
  4511.                 break;
  4512.             checkfile(&fname[2]);
  4513.             strcpy(filename,&fname[2]);
  4514.             lmode = 0;
  4515.             goto start;
  4516.         }
  4517.         if(rcode == -2) {
  4518.             lmode = 1;
  4519.             fno--;
  4520.             continue;
  4521.         }
  4522.         if(rcode == -4) {
  4523.             fupmode = 1;
  4524.             continue;
  4525.         }
  4526.         if(rcode == -5)
  4527.             break;
  4528.         if(rcode == -3)
  4529.             fno++;
  4530.         else
  4531.             fno = rcode;
  4532.         lmode = 0;
  4533.     }
  4534.     
  4535. owari:
  4536.     if(!batmode) {
  4537.         if((tagmode == 1) || (tagmode == 2)) {
  4538.             if(fd1 = fopen(datfile,"wt")) {
  4539.                 for(i=0;i < MAXDATF;i++) {
  4540.                     if(!datf[i]) continue;
  4541.                     _fstrcpy((char far *)buf,datf[i]);
  4542.                     if(!(w=jstrchr(buf,' '))) continue;
  4543.                     if(*(w+1) == '0') continue;
  4544.                     strcat(buf,"\n");
  4545.                     farfree(datf[i]);
  4546.                     if(fputs(buf,fd1) == EOF) break;
  4547.                 }
  4548.                 fclose(fd1);
  4549.             }
  4550.         }
  4551.         setline(saveline);
  4552.         restorecon(0);
  4553.         allclr();
  4554.         cslon();
  4555.         if(printonoff) {
  4556.             w = getenv("TMP");
  4557.             strcpy(buf,"DEL ");
  4558.             if(w) {
  4559.                 strcat(buf,w);
  4560.                 if(buf[strlen(buf)-1] != '\\') strcat(buf,"\\");
  4561.             }
  4562.             else strcat(buf,"\\");
  4563.             strcat(buf,"$PR*.*");
  4564.             system(buf);
  4565.             ems_lno = -1;
  4566.         }
  4567.     }
  4568.     for(ep = 0;file[ep] && ep < FMAXFILE;ep++)
  4569.         farfree(file[ep]);
  4570.     for(ep = 0;cutstrtbl[ep] && ep < MAXCUTNO;ep++)
  4571.         farfree(cutstrtbl[ep]);
  4572.     for(ep = 0;msgstrtbl[ep] && ep < MAXMSGNO;ep++)
  4573.         farfree(msgstrtbl[ep]);
  4574.     tbl_rtn();
  4575. }
  4576.